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構造体
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,           。