📄 interface.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 + -