crypto_2
8972 ワード
1,復号CERT_INFO構造は証明書を与え、最初のステップは関数CertCreateCertificateContextを呼び出して証明書BLOBを復号することである.この関数が呼び出されると、コード証明書のレプリカが生成され、CERT_が作成されます.CONETXTタイプの構造とCERT_INFOタイプの構造.certificate_contextには、元の証明書BLOB、CERT_が含まれています.CONETXTタイプの構造とCERT_INFOタイプの構造.以下、CERT_を具体的に見てみましょう.CONETXTおよびCERT_INFOの構造(wincrypt.h):typedef struct_CERT_CONTEXT { DWORD dwCertEncodingType; BYTE *pbCertEncoded; DWORD cbCertEncoded; PCERT_INFO pCertInfo; HCERTSTORE hCertStore; } CERT_CONTEXT, *PCERT_CONTEXT; typedef const CERT_CONTEXT *PCCERT_CONTEXT; typedef struct _CERT_INFO { DWORD dwVersion; CRYPT_INTEGER_BLOB SerialNumber; CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm; CERT_NAME_BLOB Issuer; FILETIME NotBefore; FILETIME NotAfter; CERT_NAME_BLOB Subject; CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; CRYPT_BIT_BLOB IssuerUniqueId; CRYPT_BIT_BLOB SubjectUniqueId; DWORD cExtension; PCERT_EXTENSION rgExtension; } CERT_INFO, *PCERT_INFO; typedef struct _CERT_EXTENSIONS { DWORD cExtension; PCERT_EXTENSION rgExtension; } CERT_EXTENSIONS, *PCERT_EXTENSIONS;上記の3つの構造から、証明書のストレージ・プロシージャが明らかになります.(具体的なパラメータの意味はパラメータ名で見ることができる)2,CERT_を符号化するINFO構造符号化プロセスと復号化プロセスは逆であり、次の例では、CERT_への発行者の追加方法について説明する.INFO構造中です.1.発行者名を含む文字列を作成します.2,CERT_を作成するRDN_ATTR構造の配列で、初期化後に作成した文字列を含めることができます.3,CERT_を作成する初期化されたばかりのCERT_を含むRDN構造の配列RDN_ATTR構造の配列4、CERT_を作成NAME_INFO構造は作成したばかりのCERT_を指すRDN構造の配列のポインタ5は、CryptEncodeObject関数を呼び出して出力符号化後のBLOBの長さを取得する.6,BLOBのためにメモリ空間7を割り当てて、再びCryptEncodeObject関数を呼び出して、関連する符号化情報を8に書き込んで、CERT_を設定しますINFO構造のIssuer.cbDataは、ステップ5で得る長さとしてIssuerを設定.pbDataはステップ6で得られたアドレスであり,現在発行者はCERT_に存在する.INFO構造中です.エンコードされた拡張情報をCERT_に追加INFO構造の1で、拡張情報構造を初期化します.2 CryptEncodeObjectを呼び出し、必要なスペースサイズを取得します.3,分配空間4,CryptEncodeObjectを再度呼び出して符号化された情報を取得する.5,CERT_を作成するEXTENSION構造配列6、CERT_を初期化EXTENSION、CERT_EXTENSIONにコードしたばかりの情報を追加します.7,CERT_を初期化するINFO構造のrgExtensionは、CERT_を指します.EXTENSION構造配列(
接続:
1.CERT_RDN_ATTR構造体
接続:
1.CERT_RDN_ATTR構造体
typedef struct _CERT_RDN_ATTR {
LPSTR pszObjId;
DWORD dwValueType;
CERT_RDN_VALUE_BLOB Value;
} CERT_RDN_ATTR,
*PCERT_RDN_ATTR;
pszObjId: , , MSDN , wincrypt.h 。 szOID_STATE_OR_PROVINCE_NAME, 。
dwValueType: Value , MSDN, ,Value , CERT_RDN_PRINTABLE_STRING, 。
Value: , 。
typedef struct _CRYPTOAPI_BLOB {
DWORD cbData;
BYTE* pbData;
} , cbData ,pbData 。
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 {
DWORD cRDNAttr;
PCERT_RDN_ATTR rgRDNAttr;
} CERT_RDN,
*PCERT_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 {
DWORD cRDN;
PCERT_RDN rgRDN;
} CERT_NAME_INFO,
*PCERT_NAME_INFO;
: 。
4.CERT_REQUEST_INFO : , , , 。
typedef struct _CERT_REQUEST_INFO {
DWORD dwVersion;
CERT_NAME_BLOB Subject;
CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo;
DWORD cAttribute;
PCRYPT_ATTRIBUTE rgAttribute;
} CERT_REQUEST_INFO,
*PCERT_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, 。