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

📄 certinfopage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		ASN1_STRING_print_ex(mem,str,ASN1_STRFLGS_ESC_QUOTE );
		BUF_MEM * bptr;
		BIO_get_mem_ptr(mem, &bptr);
		len = bptr->length;
		char * pbuf = new char[len+1];
		memset(pbuf,0,len+1);
		memcpy(pbuf,bptr->data,len);
		
		delete [] pbuf;
		if (mem != NULL) BIO_free(mem);
		OBJ_cleanup();

		strcat(outName,objtmp);//C
		strcat(outName,"=");//=
		strcat(outName,buf);
		strcat(outName," ");
		strcat(outName,"\n");
	}
	return TRUE;
}

char * CCertInfoPage::GetCertTime(const ASN1_UTCTIME *s)
{
	char buf[128]={0};
	char * p=buf;
	struct tm tm;

	memset(&tm,'\0',sizeof tm);

#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
	tm.tm_year=g2(s->data);
	if(tm.tm_year < 50)
		tm.tm_year+=100;
	tm.tm_mon=g2(s->data+2);
	tm.tm_mday=g2(s->data+4);
	tm.tm_hour=g2(s->data+6);
	tm.tm_min=g2(s->data+8);
	tm.tm_sec=g2(s->data+10);
#undef g2

	TIME_ZONE_INFORMATION TimeZoneInformation;
	GetTimeZoneInformation(&TimeZoneInformation);
 
	sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d",tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
		tm.tm_hour-(TimeZoneInformation.Bias)/60,tm.tm_min,tm.tm_sec);
	return p;
}

int CCertInfoPage::GetExtensions(BIO *bp,STACK_OF(X509_EXTENSION) *exts)
{
	const UINT uLen = 82;
	char objtmp[uLen]={0};
	int fn_nid;

	int count=sk_X509_EXTENSION_num(exts);
	if( count<= 0) return 1;
	for (int i=0; i<count; i++)
	{
		ASN1_OBJECT *obj;
		X509_EXTENSION *ex;
		ex=sk_X509_EXTENSION_value(exts, i);
	/*	if(i!=0)
		{
			if (BIO_printf(bp,"%*s",indent, "") <= 0) return 0;//indent空格长度
		}
*/		obj=X509_EXTENSION_get_object(ex);

		fn_nid = OBJ_obj2nid(obj);
		if(fn_nid==NID_undef)
			OBJ_obj2txt(objtmp, sizeof objtmp, obj, 1);
		else
		{
			switch(fn_nid)
			{
			case 82://"X509v3 Subject Key Identifier" 
				strncpy(objtmp, MiniCT_1513, uLen);	//使用者密钥标识符
				break;
			case 83://"X509v3 Key Usage"  
				strncpy(objtmp, MiniCT_1514, uLen); //密钥用法
				break;
			case 84://"X509v3 Private Key Usage Period" 
				strncpy(objtmp, MiniCT_1515, uLen);	//私钥周期
				break;
			case 85://"X509v3 Subject Alternative Name"
				strncpy(objtmp,MiniCT_1516, uLen);	//使用者备用名称
				break;
			case 86://"X509v3 Issuer Alternative Name" 3 
				strncpy(objtmp, MiniCT_1517, uLen); //颁发机构备用名称
				break;
			case 87://"X509v3 Basic Constraints" 4
				strncpy(objtmp, MiniCT_1518, uLen); //基本限制
				break;
			case 88://"X509v3 CRL Number"
				strncpy(objtmp, MiniCT_1519, uLen); //CRL数量
				break;
			case 141://"X509v3 CRL Reason Code"
				strncpy(objtmp, MiniCT_1520, uLen); //CRL吊销原因
				break;
			case 103://"X509v3 CRL Distribution Points"
				strncpy(objtmp, MiniCT_1521, uLen);	//CRL 分发点
				break;
			case 89://"X509v3 Certificate Policies"
				strncpy(objtmp, MiniCT_1522, uLen); //证书策略
				break;
			case 90://"X509v3 Authority Key Identifier"
				strncpy(objtmp, MiniCT_1523, uLen);
				break;
			case 126://"X509v3 Authority Key Identifier"
				strncpy(objtmp, MiniCT_1524, uLen); //增强型密钥用法
				break;
			case 177://Authority Information Access
				strncpy(objtmp, MiniCT_1525, uLen);	//颁发机构信息访问
				break;
			default:
				i2t_ASN1_OBJECT(objtmp,sizeof(objtmp),obj);
				break;

			}
		}

		BIO_printf(bp,"%s: ",objtmp);//输入字符域
		if(!X509V3_EXT_print(bp, ex, X509_FLAG_COMPAT, 1))//输出可以识别项
		{
			M_ASN1_OCTET_STRING_print(bp,ex->value);//输出不可识别项目
		}
		BIO_puts(bp, "\r\n");//分割
	}
	return 1;
}

UINT CCertInfoPage::GetKeyLen(const void * px509)
{
	UINT uReturn = 0;
	X509 * x509 = NULL;
	if(px509 != NULL)
		x509 = (X509 *)px509;
	//得到公钥
	EVP_PKEY * pkey = NULL;
	pkey = X509_get_pubkey(x509);
	if(pkey == NULL)
	{
		return 0;
	}
	
	if(EVP_PKEY_type(pkey->type) == EVP_PKEY_RSA)/////////RSA
	{
		RSA * rsa = EVP_PKEY_get1_RSA(pkey);
		if(rsa != NULL)
		{
			//公钥长度 
			uReturn = EVP_PKEY_bits(pkey);
			RSA_free(rsa);
		}
	}
	return uReturn;

}

BOOL CCertInfoPage::GetSubjectInfo(const void * px509,char * name,char * msg)
{
	X509 * x509=NULL;
	if(px509!=NULL)
		x509=(X509 *)px509;
	BOOL b = GetCertName(X509_get_subject_name(x509),(char *)name);
	if(!b)
	{
		strncpy(msg, MiniCT_1526, 24); //取得证书个体名称失败
	}
	return b;
}

//得到证书信息
BOOL CCertInfoPage::GetCertInfo(const char * pCert,
				 const UINT certLen,
				 const void * px509,
				 stuCERTINFO & certinfo,
				 char * msg)
{
	BOOL bFreeX509 = FALSE; //是否释放X509标识,如果内部合成的,最后释放,如果外部传入的,不释放
	BOOL bRet = TRUE;	//操作结果
	char buf[255] = {0};
	UINT bits = 0;
	char * certBuf = NULL;
	X509 * x509 = NULL;
	EVP_PKEY * pkey = NULL;
	char * stringval = NULL;
	BIO * mem = NULL;
	BUF_MEM *bptr = NULL;
	X509_CINF *ci = NULL;
	int len = 0;
	int type ;
	if(pCert)
		len = strlen(pCert);	
	if(px509 != NULL)
		x509 = (X509 *)px509;
	else if(len != 0)
	{
		x509 = CCertKey::LoadCert((char *)pCert,certLen,"",msg);
		if (x509 == NULL)
		{
			strncpy(msg, MiniCT_1527, uIniTextLen); //转换证书失败
			bRet =  FALSE;
			goto err;
		}
		bFreeX509 = TRUE;
	}
	else
	{
		strncpy(msg, MiniCT_1528, uIniTextLen); //没有任何证书信息
		bRet =  FALSE;
		goto err;
	}
	ci = x509->cert_info;
	mem = BIO_new(BIO_s_mem());
	BIO_set_close(mem, BIO_CLOSE); /*  BIO_free() free BUF_MEM  */

	//版本
	certinfo.VER=X509_get_version(x509)+1;

	//序列号
	stringval = i2s_ASN1_INTEGER(NULL,X509_get_serialNumber(x509)); //leak
	sprintf(certinfo.SN,"0%X",atoi(stringval));
	OPENSSL_free(stringval);

	//签名算法
	i2t_ASN1_OBJECT(certinfo.SIGNATURE,1024,ci->signature->algorithm);

	//颁发者
	GetCertName(X509_get_issuer_name(x509),certinfo.ISSUER);

	//起始日期
	strcpy(certinfo.NOTBEFORE,GetCertTime(X509_get_notBefore(x509)));
	//中止日期
	strcpy(certinfo.NOTAFTER,GetCertTime(X509_get_notAfter(x509)));

	//主题
	GetCertName(X509_get_subject_name(x509),certinfo.SUBJECT);

	//得到公钥
	pkey = X509_get_pubkey(x509);
	if(pkey == NULL)
	{
		strncpy(msg, MiniCT_1529, uIniTextLen); //取得公钥失败
		bRet =  FALSE;
		goto err;
	}
	
	type = EVP_PKEY_type(pkey->type);


	if(type==EVP_PKEY_RSA)/////////RSA
	{
	//	char * sign=BN_bn2hex(pkey->pkey.rsa->n);
		//转换公钥rsa->der->数字
		strcpy(certinfo.PUBTYPE,"RSA");
		RSA * rsa = EVP_PKEY_get1_RSA(pkey);
		if(rsa != NULL)
		{
			//公钥长度 
			bits = EVP_PKEY_bits(pkey);
			certinfo.PUBLEN = bits;
			certBuf = new char[bits+1];
			i2d_RSAPublicKey_bio(mem,rsa);
			BIO_get_mem_ptr(mem, &bptr);
			UINT len = bptr->length;
			char * pbuf = new char[len+1];
			memset(pbuf,0,len+1);
			memcpy(pbuf,bptr->data,len);
			for(DWORD i = 0, j = 0; i < len, j < len*2; i++, j+=2)
			{
				unsigned char t = pbuf[i];
				sprintf((char *)&certBuf[j],"%X",t>>4);
				sprintf((char *)&certBuf[j+1],"%X",t&0x0F);
			}
			UINT keylen = sizeof(certinfo.PUBKEY);
			if(keylen < len*2)
				strncpy(certinfo.PUBKEY,certBuf,keylen);
			else
				strncpy(certinfo.PUBKEY,certBuf,bits+1);
			delete []pbuf;
			delete []certBuf;
			RSA_free(rsa);
		}
		else
			strncpy(certinfo.PUBKEY, MiniCT_1530, uIniTextLen); //取得RSA失败
	}
	else if(type == EVP_PKEY_DSA)/////////DSA
	{
	//	char * sign=BN_bn2hex(pkey->pkey.rsa->n);
		//转换公钥rsa->der->数字
		strcpy(certinfo.PUBTYPE,"DSA");
		DSA * dsa = EVP_PKEY_get1_DSA(pkey);
		if(dsa!=NULL)
		{
			//公钥长度 
			bits=BN_num_bits(dsa->pub_key);
			certinfo.PUBLEN=bits;
			certBuf=new char[bits+1];

			i2d_DSA_PUBKEY_bio(mem,dsa);
			BIO_get_mem_ptr(mem, &bptr);
			UINT len=bptr->length;
			char * pbuf=new char[len+1];
			memset(pbuf,0,len+1);
			memcpy(pbuf,bptr->data,len);
			for(DWORD i = 0,j = 0; i < len, j<len*2; i++, j+=2)
			{
				unsigned char t = pbuf[i];
				sprintf((char *)&certBuf[j],"%X",t>>4);
				sprintf((char *)&certBuf[j+1],"%X",t&0x0F);
			}
			UINT keylen = sizeof(certinfo.PUBKEY);
			if(keylen < len*2)
				strncpy(certinfo.PUBKEY,certBuf,keylen);
			else
				strncpy(certinfo.PUBKEY,certBuf,bits+1);
			delete []pbuf;
			DSA_free(dsa);
		}
		else
			strncpy(certinfo.PUBKEY, MiniCT_1531, uIniTextLen); //取得DSA失败
	}


	//扩展信息
	BIO_reset(mem);//恢复bio
	if(GetExtensions(mem,ci->extensions))
	{
		BIO_get_mem_ptr(mem, &bptr);
		UINT len = bptr->length;
		char * pbuf = new char[len+1];
		memset(pbuf, 0, len+1);
		memcpy(pbuf, bptr->data, len);
		if(sizeof(certinfo.V3EXT) < len)
			strncpy(certinfo.V3EXT, pbuf, sizeof(certinfo.V3EXT));
		else
			strncpy(certinfo.V3EXT, pbuf, len);
		delete [] pbuf;
	}
	else
		strncpy(certinfo.V3EXT, MiniCT_1532, uIniTextLen); //取得扩展信息失败
	//取得证书摘要
	if(len!=0)
	{
		strcpy(certinfo.THUMB,"sha1");
		unsigned char md_value[MAX_MD_SIZE]="";
		UINT md_len=0;

		if(!CEvp::Digest("sha1",(char *)pCert,certLen,md_value,&md_len,msg))
			strncpy(certinfo.THUMBPRINT, MiniCT_1533, uIniTextLen); //缩微图失败
		else
		{
			char buf[MAX_MD_SIZE*2+1]="";
			for(unsigned i=0;i<md_len;i++)
			{
				sprintf((char *)&buf[i*2],"%02X",md_value[i]);//02x标示1个16进制变为2个字符,空补零
			}
			strcpy(certinfo.THUMBPRINT,buf);
		}
	}

err:
	if(x509 && bFreeX509)
	{
		X509_free(x509);	//////////////////
	}
	if (mem != NULL)
		BIO_free_all(mem);
	if(pkey)
		EVP_PKEY_free(pkey); /////////////////

	return bRet;
}

void CCertInfoPage::TranslateCT()	//繙譯諸如樹型控件,列錶控件等內容
{
	SetDlgItemText(IDC_CERTINFO_READ, MiniCT_10901);
}

⌨️ 快捷键说明

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