CERT_CHAIN_FIND_BY_ISSUER_PARA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | この構造体のサイズをバイト単位で格納します。このサイズはハードコードせず、次の例のように sizeof 演算子を使用してコンパイル時に設定してください。 | ||||||
| pszUsageIdentifier | LPSTR | 8/4 | +8 | +4 | 一致させる使用法識別子を格納した、NULL で終わる ANSI 文字列へのポインターです。このメンバーが NULL の場合、任意の使用法を持つ証明書が一致対象となります。 | ||||||
| dwKeySpec | DWORD | 4 | +16 | +8 | 一致させるキー仕様の値を格納します。次のいずれかの値を指定できます。このパラメーターが 0 の場合、任意の証明書が一致します。
| ||||||
| dwAcquirePrivateKeyFlags | DWORD | 4 | +20 | +12 | CertFindChainInStore 関数の dwFindFlags パラメーターに CERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAG が含まれる場合、公開キーの比較を行うために CryptAcquireCertificatePrivateKey 関数が呼び出されます。この場合、このメンバーは CryptAcquireCertificatePrivateKey 関数の dwFlags パラメーターとして渡されます。このメンバーに指定できる値とその意味については、CryptAcquireCertificatePrivateKey 関数の dwFlags パラメーターを参照してください。 | ||||||
| cIssuer | DWORD | 4 | +24 | +16 | rgIssuer 配列の要素数を格納します。このメンバーが 0 の場合、任意の発行者が一致対象となります。 | ||||||
| rgIssuer | CRYPT_INTEGER_BLOB* | 8/4 | +32 | +20 | 一致させる X.509 の Abstract Syntax Notation One (ASN.1) でエンコードされた発行者名 BLOB の配列です。このメンバーが NULL の場合、またはコールバック関数が TRUE を返した場合、指定された KeySpec と拡張キー使用法を持つ秘密キーを備えた証明書について、チェーンに新しい要素が追加されます。 | ||||||
| pfnFindCallback | PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK | 8/4 | +40 | +24 | チェーンを作成する対象の証明書をアプリケーションが絞り込めるようにする CertChainFindByIssuerCallback コールバック関数へのポインターです。このメンバーが NULL の場合、見つかったすべての証明書に対してチェーンが構築されます。このメンバーが NULL でない場合、コールバック関数の戻り値に基づいて、見つかった証明書のチェーンが構築されます。 | ||||||
| pvFindArg | void* | 8/4 | +48 | +28 | アプリケーション定義の値であり、この構造体の pfnFindCallback メンバーが指す CertChainFindByIssuerCallback コールバック関数の pvFindArg パラメーターとして渡されます。 |
公式ドキュメント
CERT_CHAIN_FIND_BY_ISSUER_PARA 構造体は、CertFindChainInStore 関数で証明書チェーンを構築するために使用される情報を格納します。
解説(Remarks)
pdwIssuerChainIndex メンバーと pdwIssuerElementIndex メンバーは、CERT_CHAIN_FIND_BY_ISSUER_PARA_HAS_EXTRA_FIELDS マクロが定義されている場合にのみ使用できます。CERT_CHAIN_FIND_BY_ISSUER_PARA_HAS_EXTRA_FIELDS マクロが定義されている場合、アプリケーションは未使用のフィールドをすべて 0 に初期化する必要があります。
例
次の擬似コードは、この構造体の pdwIssuerChainIndex メンバーと pdwIssuerElementIndex メンバーを使用して発行者の証明書にアクセスする方法を示しています。
CERT_CHAIN_FIND_BY_ISSUER_PARA findParams;
PCCERT_CHAIN_CONTEXT pChainContext = NULL;
DWORD dwChainIndex = 0;
DWORD dwElementIndex = 0;
findParams.pdwIssuerChainIndex = &dwChainIndex;
findParams.pdwIssuerElementIndex = &dwElementIndex;
pChainContext = CertFindChainInStore(
hCertStore,
X509_ASN_ENCODING,
0,
CERT_CHAIN_FIND_BY_ISSUER,
(LPVOID)&findParams,
NULL);
if(pChainContext)
{
// Make sure the element index is valid.
if(dwElementIndex < pChainContext->
rgpChain[dwChainIndex]->cElement)
{
PCERT_CHAIN_ELEMENT pIssuerElement;
pIssuerElement = pChainContext->
rgpChain[dwChainIndex]->rgpElement[dwElementIndex];
// ...
}
// Free the certificate chain.
CertFreeCertificateChain(pChainContext);
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// CERT_CHAIN_FIND_BY_ISSUER_PARA (x64 56 / x86 32 バイト)
typedef struct CERT_CHAIN_FIND_BY_ISSUER_PARA {
DWORD cbSize;
LPSTR pszUsageIdentifier;
DWORD dwKeySpec;
DWORD dwAcquirePrivateKeyFlags;
DWORD cIssuer;
CRYPT_INTEGER_BLOB* rgIssuer;
PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFindCallback;
void* pvFindArg;
} CERT_CHAIN_FIND_BY_ISSUER_PARA;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CERT_CHAIN_FIND_BY_ISSUER_PARA
{
public uint cbSize;
public IntPtr pszUsageIdentifier;
public uint dwKeySpec;
public uint dwAcquirePrivateKeyFlags;
public uint cIssuer;
public IntPtr rgIssuer;
public IntPtr pfnFindCallback;
public IntPtr pvFindArg;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CERT_CHAIN_FIND_BY_ISSUER_PARA
Public cbSize As UInteger
Public pszUsageIdentifier As IntPtr
Public dwKeySpec As UInteger
Public dwAcquirePrivateKeyFlags As UInteger
Public cIssuer As UInteger
Public rgIssuer As IntPtr
Public pfnFindCallback As IntPtr
Public pvFindArg As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class CERT_CHAIN_FIND_BY_ISSUER_PARA(ctypes.Structure):
_fields_ = [
("cbSize", wintypes.DWORD),
("pszUsageIdentifier", ctypes.c_void_p),
("dwKeySpec", wintypes.DWORD),
("dwAcquirePrivateKeyFlags", wintypes.DWORD),
("cIssuer", wintypes.DWORD),
("rgIssuer", ctypes.c_void_p),
("pfnFindCallback", ctypes.c_void_p),
("pvFindArg", ctypes.c_void_p),
]#[repr(C)]
pub struct CERT_CHAIN_FIND_BY_ISSUER_PARA {
pub cbSize: u32,
pub pszUsageIdentifier: *mut core::ffi::c_void,
pub dwKeySpec: u32,
pub dwAcquirePrivateKeyFlags: u32,
pub cIssuer: u32,
pub rgIssuer: *mut core::ffi::c_void,
pub pfnFindCallback: *mut core::ffi::c_void,
pub pvFindArg: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type CERT_CHAIN_FIND_BY_ISSUER_PARA struct {
cbSize uint32
pszUsageIdentifier uintptr
dwKeySpec uint32
dwAcquirePrivateKeyFlags uint32
cIssuer uint32
rgIssuer uintptr
pfnFindCallback uintptr
pvFindArg uintptr
}type
CERT_CHAIN_FIND_BY_ISSUER_PARA = record
cbSize: DWORD;
pszUsageIdentifier: Pointer;
dwKeySpec: DWORD;
dwAcquirePrivateKeyFlags: DWORD;
cIssuer: DWORD;
rgIssuer: Pointer;
pfnFindCallback: Pointer;
pvFindArg: Pointer;
end;const CERT_CHAIN_FIND_BY_ISSUER_PARA = extern struct {
cbSize: u32,
pszUsageIdentifier: ?*anyopaque,
dwKeySpec: u32,
dwAcquirePrivateKeyFlags: u32,
cIssuer: u32,
rgIssuer: ?*anyopaque,
pfnFindCallback: ?*anyopaque,
pvFindArg: ?*anyopaque,
};type
CERT_CHAIN_FIND_BY_ISSUER_PARA {.bycopy.} = object
cbSize: uint32
pszUsageIdentifier: pointer
dwKeySpec: uint32
dwAcquirePrivateKeyFlags: uint32
cIssuer: uint32
rgIssuer: pointer
pfnFindCallback: pointer
pvFindArg: pointerstruct CERT_CHAIN_FIND_BY_ISSUER_PARA
{
uint cbSize;
void* pszUsageIdentifier;
uint dwKeySpec;
uint dwAcquirePrivateKeyFlags;
uint cIssuer;
void* rgIssuer;
void* pfnFindCallback;
void* pvFindArg;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CERT_CHAIN_FIND_BY_ISSUER_PARA サイズ: 32 バイト(x86)
dim st, 8 ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pszUsageIdentifier : LPSTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwKeySpec : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dwAcquirePrivateKeyFlags : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; cIssuer : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; rgIssuer : CRYPT_INTEGER_BLOB* (+20, 4byte) varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; pfnFindCallback : PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; pvFindArg : void* (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CERT_CHAIN_FIND_BY_ISSUER_PARA サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; pszUsageIdentifier : LPSTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dwKeySpec : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; dwAcquirePrivateKeyFlags : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; cIssuer : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; rgIssuer : CRYPT_INTEGER_BLOB* (+32, 8byte) varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; pfnFindCallback : PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; pvFindArg : void* (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CERT_CHAIN_FIND_BY_ISSUER_PARA
#field int cbSize
#field intptr pszUsageIdentifier
#field int dwKeySpec
#field int dwAcquirePrivateKeyFlags
#field int cIssuer
#field intptr rgIssuer
#field intptr pfnFindCallback
#field intptr pvFindArg
#endstruct
stdim st, CERT_CHAIN_FIND_BY_ISSUER_PARA ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize