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

📄 ca.h

📁 MiniCA减肥修正版 大部分源码来自王雪松的原作以及OpenSSL。(文件名基本保持原样
💻 H
字号:

#include <time.h>

#define DER			    1 //FORMAT_ASN1
#define PEM			    3	/*定义格式*/
#define P12				5
#define PVK				7	//Microsoft 格式,仅限于私钥

#define MAX_MD_SIZE			(16+20) /* The SSLv3 md5+sha1 type */
typedef char * (* PNewCrlMem)(UINT len);

struct stuSUBJECT//个体信息
{
	USHORT C_l;
	USHORT C_h;
    UCHAR C[4];//国家
	USHORT ST_l;
	USHORT ST_h;
    UCHAR ST[128];//省份
	USHORT L_l;
	USHORT L_h;
    UCHAR L[128];//城市
	USHORT O_l;
	USHORT O_h;
    UCHAR O[64];//组织
	USHORT OU_l;
	USHORT OU_h;
    UCHAR OU[64];//部门
	USHORT CN_l;
	USHORT CN_h;
    UCHAR CN[64];//名称
	USHORT MAIL_l;
	USHORT MAIL_h;
    UCHAR MAIL[128];//电子邮件

	stuSUBJECT()
	{
		memset(this,0,sizeof(stuSUBJECT));
	}
};

struct stuKEYUSAGE//密钥用途
{
	BOOL DS;//Digital Signature
	BOOL NR;//Non-Repudiation
	BOOL KE;//Key Encipherment
	BOOL DE;//Data Encipherment
	BOOL KA;//keyAgreement
	BOOL KC;//keyCertSign 
	BOOL CS;//cRLSign
	BOOL EO;//Encipher Only
	BOOL DO;//Decipher Only
	stuKEYUSAGE()
	{
		memset(this,0,sizeof(stuKEYUSAGE));
	}

};

struct stuEKEYUSAGE//增强型密钥用途
{
	BOOL SA;//服务器验证
	BOOL CA;//客户端验证
	BOOL CS;//代码签名
	BOOL EP;//安全电子邮件
	BOOL TS;//时间戳
	BOOL msCC;//代码完整
	BOOL msCTLS;//可签名信任列表
	BOOL msSGC;//联机事务处理
	BOOL msEFS;//加密磁盘上的数据
	BOOL msSC;//智能卡登录
	BOOL IP;//Internet
	stuEKEYUSAGE()
	{
		memset(this,0,sizeof(stuEKEYUSAGE));
	}

};

struct stuCERT//三者之和
{
    stuKEYUSAGE KUSAGE;
    stuEKEYUSAGE EKUSAGE;
    stuSUBJECT SUBJECT;
	stuCERT()
	{
		memset(this,0,sizeof(stuCERT));
	}
};

struct stuREVOKE//证书作废结构链表
{
	int Index;//证书序号
	time_t time;//吊销时间
	stuREVOKE * Link;
	stuREVOKE()
	{
		memset(this,0,sizeof(stuREVOKE));
	}
	stuREVOKE(int index,time_t t)
	{
		Index=index;
		time=t;;
		Link=NULL;
	}
};

/*添加链表节点*/
void AddRevoke(stuREVOKE *& Head,int index,time_t time);

/*证书格式转换函数*/
int FormatConv(
	char * fileIn/*文件内容或文件名称*/,
	int lenIn/*内存长度,为0则fileIn为文件名*/,
	char * fileOut/*输出文件*/,
	int outformat);

/*根证书生成函数,根据rootInfo信息,生成根证书公、私钥文件*/
int MakeRoot(
    stuSUBJECT * rootInfo,/*信息*/
    int bits/*密钥长度*/,
    int serial/*序列号*/,
    int days/*有效期*/,
    char * certFile/*证书文件*/,
    char * priFile/*私钥文件*/,
    int type/*类型pem-der*/);

/*证书请求生成函数,根据reqInfo信息,生成用户证书私钥文件、证书请求文件*/
int MakeReq(
	stuSUBJECT * reqInfo,/*请求信息*/
	int bits/*密钥长度*/,
	char * reqFile/*证书请求文件*/,
	char * priFile/*私钥文件*/,
	int type/*结果类型DER,PEM*/);

/*证书生成函数,通过证书请求,生成用户证书公钥文件*/
int MakeCert(
    char *certfile/*根证书公钥*/,
    int certlen,/*0则为磁盘文件,否则为内存区域*/
    char *keyfile/*根证书私钥*/,
    int keylen,/*0则为磁盘文件,否则为内存区域*/
    int serial/*序列号*/,
    char *enddate/*作废日期*/,
    int days/*有效期*/,
    char *reqfile/*请求文件*/,
	char * OCSP_URI/*颁发机构联机访问URL*/,
	char * CRL_URI/*证书吊销列表URL*/,
    stuKEYUSAGE * KUSAGE/*密钥用法*/,
    stuEKEYUSAGE * EKUSAGE/*增强密钥用法*/,
    char *outfile/*结果文件*/,
    int type/*结果类型DER,PEM*/);

//直接生成公私钥(证书)
int CreatePair(
    char *certfile/*根证书公钥*/,
    int certlen,/*0则为磁盘文件,否则为内存区域*/
    char *keyfile/*根证书私钥*/,
    int keylen,/*0则为磁盘文件,否则为内存区域*/
    int serial/*序列号*/,
    char *enddate/*作废日期*/,
    int days/*有效期*/,
    stuCERT * sCERT/*用户信息与密钥用法*/,
    int bits/*密钥长度*/,
    char * cert/*输出证书公钥*/,
    int * certl/*公钥长度*/,
    char * key/*输出证书私钥*/,
    int * keyl/*私钥长度*/,
    int type/*结果类型DER,PEM*/);

/*生成CRL函数*/
int MakeCrl(
	char *certfile,//根证书公钥
	int certlen,//为0则certfile为磁盘文件,否则为内存区域
	char *keyfile,//根证书私钥
	int keylen,//为0则keyfile为磁盘文件,否则为内存区域
	stuREVOKE * Head,//作废链表
	PNewCrlMem NewCrlMem,//回调函数
	char *& outCrl,//
	int * crll,//
	char * outfile/*crl文件*/);

/*分解p12包*/
int P12Pick(
    char *P12file,//P12文件
    char *passwd,//P12密码
    char *certdata,//公钥输出
    int *certlen,//公钥长度
    char *keydata,//私钥输出
    int *keylen,//私钥输出
    int otype/*输出类型(DER/PEM)*/);

/*合并p12包*/
int P12Pack(
    char * strP12/*OUT包文件*/,
    char * strPwd/*IN密码*/,
    char * NiceName/*好记的名称*/,
    char * strCert/*内存公钥或文件名*/,
    int plen/*公钥长度,0为磁盘文件*/,
    char * strkey/*内存私钥或文件名*/,
    int klen/*私钥长度,0为磁盘文件*/);

//修改p12包密码
int ChangeP12PW(
    char * strP12/*in包文件*/,
    char * strPwd/*IN原密码*/,
    char * strPwd2/*IN新密码*/,
    char * NiceName/*好记的名字*/,
    char * strOutP12/*out包文件*/);

//修改私钥密码
int ChangePrkPW(
	char *fileIn,//输入文件
	char *OldPwd,//原密码
	char *NewPwd,//新密码
	char *cipher,//密码算法名称
	char *fileOut/*输出文件*/);

//检验公钥、私钥是否配对
int IsPair(
    char *cert/*公钥*/,
    int certlen,/*0则为磁盘文件,否则为内存区域*/
    char *key/*私钥*/,
    int keylen/*0则为磁盘文件,否则为内存区域*/);

void *Get_Func_Err(int errp); //取得上次错误的文字信息指针

⌨️ 快捷键说明

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