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

📄 interface.h

📁 实现证书的生成和验证
💻 H
字号:
#ifndef __INTERFACE_INCLUDE
#define __INTERFACE_INCLUDE

#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <map>
#include <string>

#define BUFSIZZ 1024

#define DEF_DAYS            30
#define NETSCAPE_CERT_HDR	"certificate"
#define POSTFIX             ".srl"

#define OPERATOR_NODE "Operators"
#define CERT_FILE     "CertFile"
#define CERT_LENGTH   "CertLength"
#define KEY           "Key"
#define KEY_LENGTH    "KeySize"
#define REQ_FILE      "ReqFile"
#define REQ_LENGTH    "ReqLength"
#define KEY_FORMAT    "KeyFormat"
#define IN_FORMAT     "InFormat"
#define OUT_FORMAT    "OutFormat"
#define CA_FORMAT     "CAFormat"
#define CAKEY_FORMAT  "CAKeyFormat"
#define CA_FILE       "CAFile"
#define CAKEY_FILE    "CAKeyFile"
#define CA_PATH       "CAPath"

#define UNTRUST       "UnTrust"
#define TRUST         "Trust"
#define IGNORE_CERT   "IgnoreCert"
#define ISSUER_CHECK  "IssuerCheck"
#define CRL_CHECK     "CrlCheck"
#define CRL_CHECKALL  "CrlCheckAll"

#define CIPHER_TYPE   "CipherType"
#define PASSWORD      "Password"
#define CA_LIST       "CAList"
#define RAND_FILE     "RandFile"
#define OUT_TYPE      "OutputType"
#define IN_TYPE       "InputType"
#define CONF_FILE     "ConfigFile"
#define IN_FILE       "InFile"
#define OUT_FILE      "OutFile"
#define DAYS          "Days"
#define CHAR_SET      "CharSet"
#define SERIAL        "Serial"
#define CA_SERIAL     "CASerial"
#define EXTENTIONS    "Extensions"
#define REQ_EXT       "ReqExtentions"
#define ASN_KLUDGE    "Asn1_Kludge"
#define ALIAS         "Alias"
#define BRIEF         "Brief"
#define ENC_BRIEF     "EncBrief"
#define DEC_BRIEF     "DecBrief"
#define CONTENT       "Content"

#define MD_DIGEST     "MdDigest"
#define IF_PUBKEY     "IfPubKey"
#define IF_NEWREQ     "IfNewReq"
#define IF_NEWKEY     "IfNewKey"
#define IF_X509       "IfX509"
#define IF_VERIFY     "IfVerify"
#define IF_REQ        "IfReq"
#define IF_NEWSN      "IfNewSn"

#define PATCH         "Patch"
#define MAX_CLIENT    "MaxClients"
#define PORT          "Port"


#define OID_FILE       "oid_file"
#define OID_SECTION    "oid_section"
#define REQ_SECTION    "req"
#define DEF_SECTION    "default"
#define DEFAULT_MD     "default_md"
#define V3_EXTENSIONS  "x509_extensions"
#define REQ_EXTENSIONS "req_extensions"
#define DEF_EXTENSIONS "extensions"
#define STRING_MASK    "string_mask"
#define UTF8_IN        "utf8"
#define PROMPT         "prompt"
#define DIST_NAME      "distinguished_name"
#define ATTRIBUTES     "attributes"

#define MIN_POSTFIX    "_min"
#define MAX_POSTFIX    "_max"
#define DEF_POSTFIX    "_default"
#define VAL_POSTFIX    "_value"

//输入、输出类型
enum { FILE_TYPE = 1, STRING_TYPE };
//算法
enum { RSA_CIPHER = 1, DES_CIPHER, DES3_CIPHER };
enum { TYPE_RSA = 1, TYPE_DSA, TYPE_DH };
//数据格式
enum { 
	FORMAT_UNDEF = 0,
	FORMAT_ASN1,
	FORMAT_TEXT,
	FORMAT_PEM,
	FORMAT_NETSCAPE,
	FORMAT_PKCS12,
	FORMAT_SMIME,
	FORMAT_ENGINE,
	FORMAT_IISSGC,
};

class conv_tool
{
public:
	typedef std::map<std::string, std::string> OPERATORS_MAP;
public:
	static bool conv_char_utf8(const char *pin, size_t in_len, char *pout, size_t *pout_len, int *perrno);
	static bool conv_utf8_char(const char *pin, size_t in_len, char *pout, size_t *pout_len, int *perrno);
	static int XML2Map( OPERATORS_MAP & mapopts,
		char* pszXML, int nxmlLen, char * perr = NULL);
	static int Map2XML ( OPERATORS_MAP opts, xmlChar** ppszXML, int *pnLen, char * perr = NULL);
};

inline bool
conv_tool::conv_char_utf8(const char *pin, size_t in_len, char *pout, size_t *pout_len, int *perrno)
{
	iconv_t t = iconv_open("UTF-8", "char");
	if( (int)t == -1)
	{
		if ( perrno )
			*perrno = errno;
		iconv_close(t);
		return false;
	}
	size_t len = in_len;
	
	if( iconv(t, &pin, &len, &pout, pout_len) == -1)
	{
		if ( perrno )
			*perrno = errno;
		iconv_close(t);
		return false;
	}
	iconv_close(t);
	return true;
}

inline bool
conv_tool::conv_utf8_char(const char *pin, size_t in_len, char *pout, size_t *pout_len, int *perrno)
{
	iconv_t t = iconv_open("char", "UTF-8");
	if( (int)t == -1)
	{
		*perrno = errno;
		return false;
	}
	size_t len = in_len;
	if( iconv(t, &pin, &len, &pout, pout_len) == -1)
    {
		*perrno = errno;
		return false;
    }
    iconv_close(t);
    return true;
}

inline int
conv_tool::XML2Map( OPERATORS_MAP & mapopts,
						char* pszXML, int nxmlLen, char * perr)
{
	int ret = -1;
	xmlDocPtr pxmlDoc;
	xmlNodePtr pxmlRootNode, pxmlChildNode;
	pxmlDoc = xmlSAXParseMemoryWithData(NULL, pszXML, nxmlLen, XML_CHAR_ENCODING_UTF8, (void*)"UTF-8");
	if(pxmlDoc == NULL)	{
		if( perr )
			sprintf(perr, "转换XML出错:xmlDoc=NULL");
		return -1;
	}

	try
	{
		pxmlRootNode = xmlDocGetRootElement(pxmlDoc);
		if(pxmlRootNode != NULL &&
			xmlStrcmp(pxmlRootNode->name, (const xmlChar*)OPERATOR_NODE) == 0)	{
			pxmlChildNode = pxmlRootNode->children;
			while(pxmlChildNode) {
				const xmlChar* pszName = pxmlChildNode->name;
				const xmlChar* pszContent = xmlNodeListGetString(pxmlDoc, pxmlChildNode->xmlChildrenNode, 1);
				if(pszName != NULL && pszContent != NULL) {
					std::string szName = (char*)pszName;
					std::string szContent = (char*)pszContent;
					const char * pmsg = szContent.c_str();
					size_t msglen = szContent.length();
					size_t maxlen = msglen * 2 + 2;
					size_t outlen = maxlen;
					char * poutmsg = new char[maxlen];
					std::auto_ptr<char> p_char(poutmsg);
					char * pout = poutmsg;
					memset(poutmsg, 0, outlen);
					
					int		err		= 0;
					
					if( !conv_utf8_char(pmsg, msglen, pout, &outlen, &err) )
						throw err;
					mapopts.insert(std::make_pair(szName, std::string(poutmsg)));
				}
				pxmlChildNode = pxmlChildNode->next;
			}
		}
		ret = 0;
	}
	catch(...) {
		if( perr )
			sprintf(perr, "转换出错:出现异常");
		ret = -1;
	}
	xmlFreeDoc(pxmlDoc);
	xmlMemoryDump();
	return ret;
}

inline int
conv_tool::Map2XML ( OPERATORS_MAP opts, xmlChar** ppszXML, int *pnLen, char * perr )
{
	int ret = -1;
	xmlDocPtr pxmlDoc = xmlNewDoc(BAD_CAST "1.0");
	xmlNodePtr pxmlRootNode, pxmlNode;
	if(pxmlDoc == NULL)
		return -1;
	pxmlRootNode = xmlNewNode(NULL, BAD_CAST OPERATOR_NODE);
	xmlDocSetRootElement(pxmlDoc, pxmlRootNode);
	try	{
		OPERATORS_MAP::iterator it = opts.begin();
		for(; it != opts.end(); it++) {
			char* pszName = (char*)it->first.c_str();
			char* pszContent = (char*)it->second.c_str();
			size_t len = strlen(pszContent);
			size_t outlen = len * 2 + 2;
			char * poutmsg = new char[outlen];
			std::auto_ptr<char> p_char(poutmsg);
			char * pout = poutmsg;
			memset(poutmsg, 0, outlen);
			int		err		= 0;
			if( !conv_char_utf8(pszContent, len, pout, &outlen, &err) )	
				throw err;
			xmlNewTextChild(pxmlRootNode, NULL, BAD_CAST BAD_CAST pszName, BAD_CAST poutmsg);
		}
		xmlDocDumpFormatMemoryEnc(pxmlDoc, (xmlChar**)ppszXML, pnLen, "UTF-8", XML_CHAR_ENCODING_UTF8);
		ret = 0;
	}catch(...)	{
		if( perr )
			sprintf(perr, "转换出错:出现异常");
		ret = -1;
	}
Err:
	xmlFreeDoc(pxmlDoc);
	xmlMemoryDump();
	return ret;
}
#endif

⌨️ 快捷键说明

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