1,解码CERT_INFO结构
接上: 1.CERT_RDN_ATTR 结构体 typedef struct _CERT_RDN_ATTR { pszObjId:对象标识符,用于标识证书属性,具体可以查看MSDN中的解析,也可以查看wincrypt.h文件查看相应的定义。譬如szOID_STATE_OR_PROVINCE_NAME,表示省名。
Value:一个结构体,在这里初始化证书属性。
typedef struct _CRYPTOAPI_BLOB {
2.CERT_RDN 结构体:The CERT_RDN structure contains a relative distinguished name (RDN) consisting of an array of CERT_RDN_ATTR structures. typedef struct _CERT_RDN { 参数:cRDNAttr:rgRDNAttr数组元素的个数;rgRDNAttr:指向CERT_RDN_ATTR结构元素的数组地址。
3.CERT_NAME_INFO 结构体:The CERT_NAME_INFO structure contains subject or issuer names.The information is represented as an array of CERT_RDN structures. typedef struct _CERT_NAME_INFO { 参数:同上差不多。
4.CERT_REQUEST_INFO 证书请求结构体:这个结构体包含证书请求的主体,主体公钥,属性块等信息,这些信息都是经过编码的。
typedef struct _CERT_REQUEST_INFO {
参数:dwVersion:证书版本号,可以为CERT_V1等,根据属性扩展情况,符合不同版本证书;Subject:证书主题;SubjectPublicKeyInfo:证书主题中的公钥信息;cAttribute:rgAttribute数组元素个数,可以为0;rgAttribute:属性参数数组,可以为NULL;
以上信息都是要经过编码后的信息来填充的。
5.CryptSignAndEncodeCertificate函数,用来创建自签名证书
BOOL WINAPI CryptSignAndEncodeCertificate(
__in HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey,
__in DWORD dwKeySpec,
__in DWORD dwCertEncodingType,
__in LPCSTR lpszStructType,
__in const void* pvStructInfo,
__in PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
__in const void* pvHashAuxInfo,
__out PBYTE pbEncoded,
__in_out DWORD* pcbEncoded
);
参数:1,CSP句柄;2,指明公钥是来自签名公钥还是交换公钥,可以为AT_KEYEXCHANGE或者AT_SIGNATURE之一;3,指明编码类型,可以为X509_ASN_ENCODING;4,结构体类型,和第5个参数配合起来使用,可以为X509_CERT_CRL_TO_BE_SIGNED或者X509_CERT_REQUEST_TO_BE_SIGNED或者X509_CERT_TO_BE_SIGNED或者X509_KEYGEN_REQUEST_TO_BE_SIGNED,意思可以查看MSDN。
6,签名算法结构体,指明签名算法,算法标识可以为szOID_RSA_MD5RSA 或者szOID_RSA_SHA1RSA 或者szOID_X957_SHA1DSA ;7,可以不用,设为NULL;8,签名后数据的长度,当设为NULL时,可以用来求数据的长度;9,用于存放数据的内存空间。
|
crypto_2
最新推荐文章于 2023-11-04 10:51:08 发布