📄 certinfopage.cpp
字号:
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 + -