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

📄 caservice.cpp

📁 完成数字证书加密
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "CAService.h"#include "CertRevocateList.h"#include "CertList.h"CAService::CAService(){	OpenSSL_add_all_digests();	OpenSSL_add_all_ciphers();/*	m_crypto = new CryptoData();	assert(m_crypto!=NULL);*/		m_serialNumber = 1;	m_serialNumber = atoi(readCAconfig("SerialNumber").c_str());		initItem();	m_rootPrivKeyPath = (char*)calloc(1, 512);	assert( m_rootPrivKeyPath!=NULL );	m_rootCertPath = (char*)calloc(1, 512);	assert( m_rootCertPath!=NULL );	m_db = NULL;	m_db = new CertDB();	assert( m_db!=NULL );	m_caPath=readCAconfig("Directory", "CA");	m_crlPath=m_caPath+"/"+readCAconfig("Directory", "crl");	m_exportPath=m_caPath+"/"+ readCAconfig("Directory", "export");	m_importPath = m_caPath+"/" + readCAconfig("Directory", "import");	m_rootPath=m_caPath+"/"+readCAconfig("Directory", "root");	m_usersPath=m_caPath+"/"+readCAconfig("Directory", "users");	m_reqPath=m_caPath+"/"+readCAconfig("Directory", "req");		string cert = m_rootPath + "/" + readCAconfig("System", "rootCertPath");	string priv = m_rootPath + "/" + readCAconfig("System", "rootKeyPath");	strcpy(m_rootPrivKeyPath, priv.c_str());	strcpy(m_rootCertPath, cert.c_str());	com = new Communicate("ca");	assert(com!=NULL);	m_id = m_action = 0;	}CAService::~CAService(){	if (m_rootCertPath) free(m_rootCertPath), m_rootCertPath=NULL;	if (m_rootPrivKeyPath) free(m_rootPrivKeyPath), m_rootPrivKeyPath=NULL;	if (m_db) delete m_db, m_db=NULL;//	if (m_crypto) delete m_crypto, m_crypto=NULL;}void CAService::initItem(){	m_SerialNumber = m_ObjectType = m_CertReq = m_ObjectUpdated = m_CommonName = m_sn = m_serial = m_distingishName = "";	m_type = 0;	m_reqPath=m_caPath=m_rootPath=m_crlPath=m_exportPath=m_importPath=m_usersPath="";	m_importObject = m_Issuer = "";	m_swap = "";}void CAService::freeComm() {	if (com) com->freeCA(), delete com, com=NULL;}bool CAService::initializeConnect(){	if (!m_db->initializeConnect()) {		cout<<"Because db don't open, system exit."<<endl;		return false;	}	return true;}bool CAService::shutdownConnect(){	m_db->closeConnection();//	m_db->closeDB();	return true;}bool CAService::checkWhetherUserHaveExisted(const char* DN){	return m_db->checkWhetherUserHaveExisted(DN);}string CAService::readCAconfig(string keyword, string objectName){	string result = "";		FILE *fd = fopen(CA_CONFIG_PATH, "r");	assert(fd != NULL);		if (fd == NULL) {		result.append("");	}	else {		char *line  = (char*)calloc(1, 1*K);		string config="";		while (!feof(fd)) {			memset(line, 0, 1*K);			fgets(line, 1*K, fd); 			config.append(line);		}		fclose(fd);				NggObject *object = NggObject::fromXML(config);		assert( object!=NULL );		for (int i=0; i<object->m_Contains.size(); i++) {			if (object->m_Contains[i]->m_Name==keyword) {				if (keyword == "Root" || keyword == "Operator" || keyword == "Administrator"|| keyword=="SerialNumber") {					result.append(object->m_Contains[i]->m_Value);					}				else {					NggObject* nggobject = object->m_Contains[i];					assert( nggobject!=NULL );					for (int ii=0; ii<nggobject->m_Contains.size(); ii++) {						if (nggobject->m_Contains[ii]->m_Name==objectName) {							result.append(nggobject->m_Contains[ii]->m_Value);								break;						}					}					if (nggobject) nggobject=NULL;									}				break;			}		}		if (object) delete object, object=NULL ;		if (line) free(line), line=NULL;	}		return result;}void CAService::handleMessage(MSG msg){}void CAService::sendMessageCA(CONTENT msg){	assert( m_action!=0 );//	Communicate com("ca");	com->caSendMessageToADT(msg);}string CAService::getCRL(){	CRL crl;	return crl.getCRL();}void CAService::insertCRL(char* req){/*	if ((reqbio=BIO_new_mem_buf(req, filelen))==NULL) {		writelog("reading req fail .");		return ;	}	X509_REQ* request = NULL;	PEM_read_bio_X509_REQ();*/}void CAService::updateCRL(char* req, string action){}bool CAService::unpackMessage(string msg){	string result = "";	if (msg=="") {		return false;	}		NggObject* object = NggObject::fromXML(msg);	assert(object!=NULL);	for (int i=0; i<object->m_Contains.size(); i++) {				if (object->m_Contains[i]->m_Name=="Request") {						bool flag = false;			NggObject* obj = object->m_Contains[i];			assert(obj!=NULL);						for(int k=0; k<obj->m_Contains.size(); k++) {				if (obj->m_Contains[k]->m_Name=="Parameter") {					NggObject *rd_obj = obj->m_Contains[k];					for(int j=0; j<rd_obj->m_Contains.size(); j++) {						if (rd_obj->m_Contains[j]->m_Name=="CertReq") {							m_CertReq = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="ObjectNameUpdated") {							m_ObjectUpdated = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="ObjectType") {							m_ObjectType = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="CommonName") {							m_CommonName = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="SerialNumber") {							m_SerialNumber = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="Issuer") {							m_Issuer = rd_obj->m_Contains[j]->m_Value;						}						if (rd_obj->m_Contains[j]->m_Name=="ImportObject") {							m_importObject = rd_obj->m_Contains[j]->m_Value;						}					}					flag = true;				}			}			if (flag) {				break;			}		}	}	if (object) delete object, object=NULL;	return true;}string CAService::packMessage(string msg, string result){	m_serial = readCAconfig("SerialNumber", "");	NggObject* object = NggObject::fromXML(msg);	assert(object!=NULL);	for (int i=0; i<object->m_Contains.size(); i++) {				if (object->m_Contains[i]->m_Name=="Notification") {						NggObject* obj = object->m_Contains[i];			assert(obj!=NULL);						for(int k=0; k<obj->m_Contains.size(); k++) {				if (obj->m_Contains[k]->m_Name=="Status") {					obj->m_Contains[k]->m_Value = "ok";				}				if (obj->m_Contains[k]->m_Name=="DN") {					obj->m_Contains[k]->m_Value = m_distingishName;				}				if (obj->m_Contains[k]->m_Name=="SerialNumber") {					obj->m_Contains[k]->m_Value = m_serial;				}				if (obj->m_Contains[k]->m_Name=="Description") {					obj->m_Contains[k]->m_Value = result;				}			}			break;		}	}	msg=object->toXML();	if (object) delete object, object=NULL;	return msg;}CONTENT CAService::getMessageCA(){	char delResult[1*K];	memset(delResult, 0, 1*K);	string serialNumber="";	string thirdIssuer = "";	string crlContent = "";	string crl = "";	string issuer = "";	char* result = (char*)calloc(1, 10*K);	assert( result!=NULL );	CONTENT msg;	msg = com->caGetMessageFromADT();	m_action = msg.type;	char buf[2*K];	memset(buf, 0, 2*K);	unpackMessage(msg.buf);	switch (m_action) {		case APPLY_CERT:			strcpy(buf, m_CertReq.c_str());			if (issueTerminalCertificate(result, buf, USER_CERTIFICATE, NULL, strlen(buf))) {				strcpy(msg.buf, packMessage(msg.buf, result).c_str());			}			else {				strcpy(msg.buf, packMessage(msg.buf, "handling cert request fail.").c_str());			}			break;		case REVOKE_CERT:			strcpy(buf, m_SerialNumber.c_str());			strcpy(msg.buf, packMessage(msg.buf, removeUserCertificate(buf).c_str()).c_str());			break;		case RECOVER_CERT:			strcpy(buf, m_SerialNumber.c_str());			if (deleteCertFromCRL(buf, delResult)) {				strcpy(msg.buf, packMessage(msg.buf, "ok").c_str());			}			else {				strcpy(msg.buf, packMessage(msg.buf, delResult).c_str());			}			break;		case SHOW_CRL:			getCRL();			break;		case UPDATE_CERT:			strcpy(buf, updateUserCert().c_str());			if (strcmp(buf, "ok")) {				strcpy(msg.buf, packMessage(msg.buf, "update user cert to fail, for invalid user").c_str());				return msg;			}			writelog("succeed to remove user from db");			deleteCertFromCRL(m_swap, delResult);						writelog("update crl success");						strcpy(buf, m_CertReq.c_str());			if (m_ObjectType=="gw") {				if(issueTerminalCertificate(result, buf, GW_CERTIFICATE, NULL, strlen(buf))) {					strcpy(msg.buf, packMessage(msg.buf, result).c_str());				}				else {					strcpy(msg.buf, packMessage(msg.buf, "handling cert request fail.").c_str());				}			}			else if (m_ObjectType=="user") {				if (issueTerminalCertificate(result, buf, USER_CERTIFICATE, NULL, strlen(buf))) {					strcpy(msg.buf, packMessage(msg.buf, result).c_str());				}				else {					strcpy(msg.buf, packMessage(msg.buf, "handling cert request fail.").c_str());				}			}			writelog("create new cert success");			break;		case EXPORT_CERT:			break;		case APPLY_GW_CERT:			strcpy(buf, m_CertReq.c_str());			if(issueTerminalCertificate(result, buf, GW_CERTIFICATE, NULL, strlen(buf))) {				strcpy(msg.buf, packMessage(msg.buf, result).c_str());			}			else {				strcpy(msg.buf, packMessage(msg.buf, "handling cert request fail.").c_str());			}			break;		case VERIFY_CERT:			strcpy(msg.buf,	verifyCertificate(m_CertReq.c_str()).c_str());			break;		case IMPORT_THIRD_CRL:			if (m_importObject!="") {				strcpy(buf, m_importObject.c_str());			}			strcpy(msg.buf, importThirdCRL(buf, m_Issuer).c_str());						break;		case EXPORT_CRL:			crl = "<table><CRLs>";			issuer=readCAconfig("System", "Issuer");			crlContent = exportCRLToUser(issuer);			crl.append("<CRL issuer=\"").append(issuer).append("\">");			if (crlContent!="") {				crl.append("<serialNumbers>");				while ((serialNumber=analyzeString(crlContent)) != "") {					crl.append("<serialNumber>").						append(serialNumber).						append("</serialNumber>");				}			}			crl.append("</CRL>");			issuer = readCAconfig("CRL", "third");			if (issuer!="") {				serialNumber = "";				while ((thirdIssuer=analyzeString(issuer)) != "") {					crl.append("<CRL issuer=\"").						append(thirdIssuer).						append("\">");					if ((crlContent = exportCRLToUser(thirdIssuer)) != "") {						crl.append("<serialNumbers>");						while ((serialNumber=analyzeString(crlContent)) != "") {							crl.append("<serialNumber>").								append(serialNumber).								append("</serialNumber>");						}					}					crl.append("</CRL>");				}			}			crl.append("</CRLs></table>");			strcpy(msg.buf, packMessage(msg.buf, crl).c_str());			break;		default :			break;	}	initItem();	cout <<(char*)msg.buf<<"---------"<<__FILE__<<", "<<__LINE__<<"\n\n\n\n"<<endl;	return msg;}string CAService::exportCertIssuer(){	string tmp=readCAconfig("Directory", "CA")+			   "/"+			   readCAconfig("Directory", "root")+			   "/"+			   readCAconfig("System", "rootCertPath");	char filepath[512];	memset(filepath, 0, 512);	strcpy(filepath, tmp.c_str());	FILE *fd=fopen(filepath, "r");	assert(fd!=NULL);	string cert="";	while(!feof(fd)) {		char buf[512];		memset(buf, 0, 512);		fgets(buf, 512, fd);		cert.append(buf);	}	fclose(fd);	if (cert=="") {		return "";	}	char mem[cert.size()];	memset(mem, 0, cert.size());	strcpy(mem, cert.c_str());		BIO *io = BIO_new_mem_buf(mem, strlen(mem));	assert(io!=NULL);	X509* x509 = PEM_read_bio_X509(io, NULL, NULL, NULL);	assert(x509!=NULL);	X509_NAME* issuer=X509_get_issuer_name(x509);	assert(issuer!=NULL);	BIO* out = BIO_new(BIO_s_mem());	assert(out!=NULL);	X509_NAME_print(out, issuer, 80);	char name[80];	memset(name, 0, 80);	assert(BIO_read(out, name, 80)!=0);		X509_free(x509);	x509=NULL;	BIO_free(out);	out=NULL;	BIO_free(io);	io=NULL;	string issuerName="";	return issuerName.append(name);}string CAService::analyzeString(string& thirdIssuer){	string result = "";	char* issuer = (char*)calloc(1, 1024);	assert(issuer!=NULL);	strcpy(issuer, thirdIssuer.c_str());	char* pt = strstr(issuer, ";");	if (pt==issuer) {		return "";	}	char tmp[1*K];	memset(tmp, 0, 1*K);	strncpy(tmp, issuer, pt-1-issuer);	result.append(tmp);		thirdIssuer = "";	if (*(pt+1)==0) {		issuer = pt;	}	else {		issuer = pt+1;	}	thirdIssuer.append(issuer);	pt = NULL;	if (issuer) {		free(issuer), issuer = NULL;	}		return result;}string CAService::updateUserCert(){	string result = "ok";	if (m_ObjectUpdated=="") {		result = "don't assign object to be updated.";		return result;	}	if (!m_db->delCertFromDB(m_ObjectType, m_ObjectUpdated)) {		result = "del user's cert to fail .";		return result;	}

⌨️ 快捷键说明

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