Win32 API 日本語リファレンス
ホームSecurity.Cryptography › CertVerifyCertificateChainPolicy

CertVerifyCertificateChainPolicy

関数
証明書チェーンが指定ポリシーに適合するか検証する。
DLLCRYPT32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

// CRYPT32.dll
#include <windows.h>

BOOL CertVerifyCertificateChainPolicy(
    LPCSTR pszPolicyOID,
    CERT_CHAIN_CONTEXT* pChainContext,
    CERT_CHAIN_POLICY_PARA* pPolicyPara,
    CERT_CHAIN_POLICY_STATUS* pPolicyStatus
);

パラメーター

名前方向説明
pszPolicyOIDLPCSTRin

現在定義済みの検証チェーン ポリシー構造体を次の表に示します。

意味
CERT_CHAIN_POLICY_BASE
(LPCSTR) 1
基本チェーン ポリシーの検証チェックを実装します。pPolicyPara が指す構造体の dwFlags メンバーを設定することで、既定のポリシー チェック動作を変更できます。
CERT_CHAIN_POLICY_AUTHENTICODE
(LPCSTR) 2
Authenticode チェーン ポリシーの検証チェックを実装します。pPolicyPara が指す構造体の pvExtraPolicyPara メンバーを、AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA 構造体を指すように設定できます。

pPolicyStatus が指す構造体の pvExtraPolicyStatus メンバーを、AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS 構造体を指すように設定できます。
CERT_CHAIN_POLICY_AUTHENTICODE_TS
(LPCSTR) 3
Authenticode タイム スタンプ チェーン ポリシーの検証チェックを実装します。pPolicyPara が指すデータ構造体の pvExtraPolicyPara メンバーを、AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA 構造体を指すように設定できます。

pPolicyStatus が指すデータ構造体の pvExtraPolicyStatus メンバーは使用されず、NULL に設定する必要があります。
CERT_CHAIN_POLICY_SSL
(LPCSTR) 4
SSL クライアント/サーバー チェーン ポリシーの検証チェックを実装します。pPolicyPara が指すデータ構造体の pvExtraPolicyPara メンバーを、追加のポリシー基準で初期化された SSL_EXTRA_CERT_CHAIN_POLICY_PARA 構造体を指すように設定できます。

注: サーバー認証証明書とクライアント認証証明書を区別するには、チェーン コンテキストを取得するための CertGetCertificateChain 関数の呼び出しで、想定される用途を設定して証明書の種類を指定する必要があります。想定される用途は、CertGetCertificateChain 関数の pChainPara 入力パラメーターに渡す CERT_CHAIN_PARA 構造体の RequestedUsage メンバーを設定して指定します。
CERT_CHAIN_POLICY_BASIC_CONSTRAINTS
(LPCSTR) 5
基本制約チェーン ポリシーを実装します。チェーン内のすべての証明書を反復処理し、szOID_BASIC_CONSTRAINTS 拡張または szOID_BASIC_CONSTRAINTS2 拡張のいずれかを確認します。どちらの拡張も存在しない場合、その証明書は有効なポリシーを持つものと見なされます。それ以外の場合、最初の証明書要素については、pPolicyPara パラメーターが指す CERT_CHAIN_POLICY_PARA 構造体の dwFlags メンバーで指定された、想定される CA_FLAG または END_ENTITY_FLAG と一致するかどうかを確認します。どちらのフラグも設定されていない、または両方とも設定されている場合、最初の要素は CA または END_ENTITY のいずれであっても構いません。その他のすべての要素は証明機関 (CA) でなければなりません。拡張に PathLenConstraint が存在する場合は、それも確認されます。

残りの単純チェーン内の最初の要素 (つまり CTL の署名に使用された証明書) は、END_ENTITY であることが確認されます。この検証に失敗すると、dwErrorTRUST_E_BASIC_CONSTRAINTS に設定されます。
CERT_CHAIN_POLICY_NT_AUTH
(LPCSTR) 6
Windows NT 認証チェーン ポリシーを実装します。これは、次の順序で実行される 3 つの異なるチェーン検証で構成されます。

- CERT_CHAIN_POLICY_BASE: 基本チェーン ポリシーの検証チェックを実装します。pPolicyParadwFlags の LOWORD を設定して、既定のポリシー チェック動作を変更できます。詳細については、CERT_CHAIN_POLICY_BASE を参照してください。
- CERT_CHAIN_POLICY_BASIC_CONSTRAINTS: 基本制約チェーン ポリシーを実装します。dwFlags の HIWORD を設定して、最初の要素が CA と END_ENTITY のどちらでなければならないかを指定できます。詳細については、CERT_CHAIN_POLICY_BASIC_CONSTRAINTS を参照してください。
- チェーン内の 2 番目の要素、すなわちエンド証明書を発行した CA が、Windows NT 認証で信頼された CA であるかどうかを確認します。CA は、CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE ストアの場所にある "NTAuth" システム レジストリ ストアに存在する場合、信頼されていると見なされます。この検証に失敗した場合、その CA は信頼されておらず、dwErrorCERT_E_UNTRUSTEDCA に設定されます。CERT_PROT_ROOT_FLAGS_REGPATH で定義される HKEY_LOCAL_MACHINE ポリシーの ProtectedRoots サブキーの Flags 値に CERT_PROT_ROOT_DISABLE_NT_AUTH_REQUIRED_FLAG が設定されていて、上記のチェックに失敗した場合、チェーンに対して dwInfoStatusCERT_TRUST_HAS_VALID_NAME_CONSTRAINTS が設定されているかどうかが確認されます。これは、UPN を含むすべての名前空間に対して有効な名前制約が存在する場合に設定されます。チェーンにこの情報ステータスが設定されていない場合、dwErrorCERT_E_UNTRUSTEDCA に設定されます。
CERT_CHAIN_POLICY_MICROSOFT_ROOT
(LPCSTR) 7
最初の単純チェーンの最後の要素について、Microsoft ルート公開キーがあるかどうかを確認します。その要素に Microsoft ルート公開キーが含まれていない場合、pPolicyStatus パラメーターが指す CERT_CHAIN_POLICY_STATUS 構造体の dwError メンバーが CERT_E_UNTRUSTEDROOT に設定されます。

pPolicyStatus パラメーターが指す CERT_CHAIN_POLICY_PARA 構造体の dwFlags メンバーに MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG フラグを含めることができます。これにより、この関数は代わりに Microsoft アプリケーション ルート "Microsoft Root Certificate Authority 2011" を確認します。

pPolicyPara パラメーターが指す CERT_CHAIN_POLICY_PARA 構造体の dwFlags メンバーに MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG フラグを含めることができます。これにより、この関数は Microsoft テスト ルートも確認します。

注:
このポリシーオブジェクト識別子 (OID) は、それ自体ではポリシー検証チェックを一切実行しません。他のポリシーと組み合わせて使用することを意図したものです。
CERT_CHAIN_POLICY_EV
(LPCSTR) 8
証明書の拡張検証を実行することを指定します。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値はサポートされていません。
CERT_CHAIN_POLICY_SSL_F12
(LPCSTR) 9
チェーン内のいずれかの証明書が脆弱な暗号を使用しているか、サードパーティのルート証明書が準拠しているかどうかを確認し、エラー文字列を提供します。pPolicyStatus パラメーターが指す CERT_CHAIN_POLICY_STATUS 構造体の pvExtraPolicyStatus メンバーは、SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS を指している必要があります。これは脆弱な暗号およびルート プログラム準拠チェックの結果で更新されます。

呼び出す前に、pPolicyStatus パラメーターが指す CERT_CHAIN_POLICY_STATUS 構造体の cbSize メンバーを、sizeof(SSL_F12_EXTRA_CERT_CHAIN_POLICY_STATUS) 以上の値に設定する必要があります。

pPolicyStatus パラメーターが指す CERT_CHAIN_POLICY_STATUS 構造体の dwError メンバーは、脆弱な暗号の可能性がある場合は TRUST_E_CERT_SIGNATURE に、Microsoft Root Program に準拠していないサードパーティ ルートの場合は CERT_E_UNTRUSTEDROOT に設定されます。

Windows 10 バージョン 1607、Windows Server 2016、KB3172985 適用の Windows 10 バージョン 1511、KB3163912 適用の Windows 10 RTM、KB3163912 適用の Windows 8.1 および Windows Server 2012 R2、SP1 適用の Windows 7、ならびに KB3161029 適用の SP1 適用 Windows Server 2008 R2
pChainContextCERT_CHAIN_CONTEXT*in検証対象のチェーンを含む CERT_CHAIN_CONTEXT 構造体へのポインター。
pPolicyParaCERT_CHAIN_POLICY_PARA*in

チェーンに対するポリシー検証基準を提供する CERT_CHAIN_POLICY_PARA 構造体へのポインター。この構造体の dwFlags メンバーを設定して、既定のポリシー チェック動作を変更できます。

さらに、ポリシー固有のパラメーターを構造体の pvExtraPolicyPara メンバーで渡すこともできます。

pPolicyStatusCERT_CHAIN_POLICY_STATUS*inoutチェーンに関するステータス情報が返される CERT_CHAIN_POLICY_STATUS 構造体へのポインター。OID 固有の追加ステータスは、この構造体の pvExtraPolicyStatus メンバーで返されることがあります。

戻り値の型: BOOL

公式ドキュメント

証明書チェーンを検査し、指定された有効性ポリシー基準への準拠を含めて、その有効性を検証します。

戻り値

戻り値は、関数がポリシーを検査できたかどうかを示すものであり、ポリシー チェックが失敗したか成功したかを示すものではありません。

指定されたポリシーについてチェーンを検証できた場合は TRUE が返され、pPolicyStatusdwError メンバーが更新されます。dwError0 (ERROR_SUCCESS または S_OK) の場合、チェーンが指定されたポリシーを満たしていることを示します。

チェーンを検証できない場合でも戻り値は TRUE であり、実際のエラーについては pPolicyStatus パラメーターを確認する必要があります。

FALSE の値は、関数がポリシーを検査できなかったことを示します。

解説(Remarks)

pPolicyStatus が指す CERT_CHAIN_POLICY_STATUS 構造体の dwError メンバーは、単一のチェーン要素、単純チェーン、またはチェーン コンテキスト全体に適用される場合があります。dwError がチェーン コンテキスト全体に適用される場合、CERT_CHAIN_POLICY_STATUS 構造体の lChainIndex メンバーと lElementIndex メンバーの両方が –1 に設定されます。dwError が単純チェーン全体に適用される場合、lElementIndex–1 に設定され、lChainIndex はエラーを持つ最初のチェーンのインデックスに設定されます。dwError が単一の証明書要素に適用される場合、lChainIndexlElementIndex はエラーを持つ最初の証明書を指します。

証明書要素を取得するには、次の構文を使用します。

pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex];

証明書失効チェックを有効にして実行するには、CertGetCertificateChain 関数を使用してください。CertVerifyCertificateChainPolicy 関数は、証明書チェーン内の証明書が失効しているかどうかをチェックしません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// CRYPT32.dll
#include <windows.h>

BOOL CertVerifyCertificateChainPolicy(
    LPCSTR pszPolicyOID,
    CERT_CHAIN_CONTEXT* pChainContext,
    CERT_CHAIN_POLICY_PARA* pPolicyPara,
    CERT_CHAIN_POLICY_STATUS* pPolicyStatus
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll", ExactSpelling = true)]
static extern bool CertVerifyCertificateChainPolicy(
    [MarshalAs(UnmanagedType.LPStr)] string pszPolicyOID,   // LPCSTR
    IntPtr pChainContext,   // CERT_CHAIN_CONTEXT*
    IntPtr pPolicyPara,   // CERT_CHAIN_POLICY_PARA*
    IntPtr pPolicyStatus   // CERT_CHAIN_POLICY_STATUS* in/out
);
<DllImport("CRYPT32.dll", ExactSpelling:=True)>
Public Shared Function CertVerifyCertificateChainPolicy(
    <MarshalAs(UnmanagedType.LPStr)> pszPolicyOID As String,   ' LPCSTR
    pChainContext As IntPtr,   ' CERT_CHAIN_CONTEXT*
    pPolicyPara As IntPtr,   ' CERT_CHAIN_POLICY_PARA*
    pPolicyStatus As IntPtr   ' CERT_CHAIN_POLICY_STATUS* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' pszPolicyOID : LPCSTR
' pChainContext : CERT_CHAIN_CONTEXT*
' pPolicyPara : CERT_CHAIN_POLICY_PARA*
' pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out
Declare PtrSafe Function CertVerifyCertificateChainPolicy Lib "crypt32" ( _
    ByVal pszPolicyOID As String, _
    ByVal pChainContext As LongPtr, _
    ByVal pPolicyPara As LongPtr, _
    ByVal pPolicyStatus As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CertVerifyCertificateChainPolicy = ctypes.windll.crypt32.CertVerifyCertificateChainPolicy
CertVerifyCertificateChainPolicy.restype = wintypes.BOOL
CertVerifyCertificateChainPolicy.argtypes = [
    wintypes.LPCSTR,  # pszPolicyOID : LPCSTR
    ctypes.c_void_p,  # pChainContext : CERT_CHAIN_CONTEXT*
    ctypes.c_void_p,  # pPolicyPara : CERT_CHAIN_POLICY_PARA*
    ctypes.c_void_p,  # pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPT32.dll')
CertVerifyCertificateChainPolicy = Fiddle::Function.new(
  lib['CertVerifyCertificateChainPolicy'],
  [
    Fiddle::TYPE_VOIDP,  # pszPolicyOID : LPCSTR
    Fiddle::TYPE_VOIDP,  # pChainContext : CERT_CHAIN_CONTEXT*
    Fiddle::TYPE_VOIDP,  # pPolicyPara : CERT_CHAIN_POLICY_PARA*
    Fiddle::TYPE_VOIDP,  # pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "crypt32")]
extern "system" {
    fn CertVerifyCertificateChainPolicy(
        pszPolicyOID: *const u8,  // LPCSTR
        pChainContext: *mut CERT_CHAIN_CONTEXT,  // CERT_CHAIN_CONTEXT*
        pPolicyPara: *mut CERT_CHAIN_POLICY_PARA,  // CERT_CHAIN_POLICY_PARA*
        pPolicyStatus: *mut CERT_CHAIN_POLICY_STATUS  // CERT_CHAIN_POLICY_STATUS* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll")]
public static extern bool CertVerifyCertificateChainPolicy([MarshalAs(UnmanagedType.LPStr)] string pszPolicyOID, IntPtr pChainContext, IntPtr pPolicyPara, IntPtr pPolicyStatus);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CertVerifyCertificateChainPolicy' -Namespace Win32 -PassThru
# $api::CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
#uselib "CRYPT32.dll"
#func global CertVerifyCertificateChainPolicy "CertVerifyCertificateChainPolicy" sptr, sptr, sptr, sptr
; CertVerifyCertificateChainPolicy pszPolicyOID, varptr(pChainContext), varptr(pPolicyPara), varptr(pPolicyStatus)   ; 戻り値は stat
; pszPolicyOID : LPCSTR -> "sptr"
; pChainContext : CERT_CHAIN_CONTEXT* -> "sptr"
; pPolicyPara : CERT_CHAIN_POLICY_PARA* -> "sptr"
; pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "CRYPT32.dll"
#cfunc global CertVerifyCertificateChainPolicy "CertVerifyCertificateChainPolicy" str, var, var, var
; res = CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
; pszPolicyOID : LPCSTR -> "str"
; pChainContext : CERT_CHAIN_CONTEXT* -> "var"
; pPolicyPara : CERT_CHAIN_POLICY_PARA* -> "var"
; pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL CertVerifyCertificateChainPolicy(LPCSTR pszPolicyOID, CERT_CHAIN_CONTEXT* pChainContext, CERT_CHAIN_POLICY_PARA* pPolicyPara, CERT_CHAIN_POLICY_STATUS* pPolicyStatus)
#uselib "CRYPT32.dll"
#cfunc global CertVerifyCertificateChainPolicy "CertVerifyCertificateChainPolicy" str, var, var, var
; res = CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
; pszPolicyOID : LPCSTR -> "str"
; pChainContext : CERT_CHAIN_CONTEXT* -> "var"
; pPolicyPara : CERT_CHAIN_POLICY_PARA* -> "var"
; pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
	procCertVerifyCertificateChainPolicy = crypt32.NewProc("CertVerifyCertificateChainPolicy")
)

// pszPolicyOID (LPCSTR), pChainContext (CERT_CHAIN_CONTEXT*), pPolicyPara (CERT_CHAIN_POLICY_PARA*), pPolicyStatus (CERT_CHAIN_POLICY_STATUS* in/out)
r1, _, err := procCertVerifyCertificateChainPolicy.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(pszPolicyOID))),
	uintptr(pChainContext),
	uintptr(pPolicyPara),
	uintptr(pPolicyStatus),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function CertVerifyCertificateChainPolicy(
  pszPolicyOID: PAnsiChar;   // LPCSTR
  pChainContext: Pointer;   // CERT_CHAIN_CONTEXT*
  pPolicyPara: Pointer;   // CERT_CHAIN_POLICY_PARA*
  pPolicyStatus: Pointer   // CERT_CHAIN_POLICY_STATUS* in/out
): BOOL; stdcall;
  external 'CRYPT32.dll' name 'CertVerifyCertificateChainPolicy';
result := DllCall("CRYPT32\CertVerifyCertificateChainPolicy"
    , "AStr", pszPolicyOID   ; LPCSTR
    , "Ptr", pChainContext   ; CERT_CHAIN_CONTEXT*
    , "Ptr", pPolicyPara   ; CERT_CHAIN_POLICY_PARA*
    , "Ptr", pPolicyStatus   ; CERT_CHAIN_POLICY_STATUS* in/out
    , "Int")   ; return: BOOL
●CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus) = DLL("CRYPT32.dll", "bool CertVerifyCertificateChainPolicy(char*, void*, void*, void*)")
# 呼び出し: CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
# pszPolicyOID : LPCSTR -> "char*"
# pChainContext : CERT_CHAIN_CONTEXT* -> "void*"
# pPolicyPara : CERT_CHAIN_POLICY_PARA* -> "void*"
# pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "crypt32" fn CertVerifyCertificateChainPolicy(
    pszPolicyOID: [*c]const u8, // LPCSTR
    pChainContext: [*c]CERT_CHAIN_CONTEXT, // CERT_CHAIN_CONTEXT*
    pPolicyPara: [*c]CERT_CHAIN_POLICY_PARA, // CERT_CHAIN_POLICY_PARA*
    pPolicyStatus: [*c]CERT_CHAIN_POLICY_STATUS // CERT_CHAIN_POLICY_STATUS* in/out
) callconv(std.os.windows.WINAPI) i32;
proc CertVerifyCertificateChainPolicy(
    pszPolicyOID: cstring,  # LPCSTR
    pChainContext: ptr CERT_CHAIN_CONTEXT,  # CERT_CHAIN_CONTEXT*
    pPolicyPara: ptr CERT_CHAIN_POLICY_PARA,  # CERT_CHAIN_POLICY_PARA*
    pPolicyStatus: ptr CERT_CHAIN_POLICY_STATUS  # CERT_CHAIN_POLICY_STATUS* in/out
): int32 {.importc: "CertVerifyCertificateChainPolicy", stdcall, dynlib: "CRYPT32.dll".}
pragma(lib, "crypt32");
extern(Windows)
int CertVerifyCertificateChainPolicy(
    const(char)* pszPolicyOID,   // LPCSTR
    CERT_CHAIN_CONTEXT* pChainContext,   // CERT_CHAIN_CONTEXT*
    CERT_CHAIN_POLICY_PARA* pPolicyPara,   // CERT_CHAIN_POLICY_PARA*
    CERT_CHAIN_POLICY_STATUS* pPolicyStatus   // CERT_CHAIN_POLICY_STATUS* in/out
);
ccall((:CertVerifyCertificateChainPolicy, "CRYPT32.dll"), stdcall, Int32,
      (Cstring, Ptr{CERT_CHAIN_CONTEXT}, Ptr{CERT_CHAIN_POLICY_PARA}, Ptr{CERT_CHAIN_POLICY_STATUS}),
      pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
# pszPolicyOID : LPCSTR -> Cstring
# pChainContext : CERT_CHAIN_CONTEXT* -> Ptr{CERT_CHAIN_CONTEXT}
# pPolicyPara : CERT_CHAIN_POLICY_PARA* -> Ptr{CERT_CHAIN_POLICY_PARA}
# pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> Ptr{CERT_CHAIN_POLICY_STATUS}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t CertVerifyCertificateChainPolicy(
    const char* pszPolicyOID,
    void* pChainContext,
    void* pPolicyPara,
    void* pPolicyStatus);
]]
local crypt32 = ffi.load("crypt32")
-- crypt32.CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
-- pszPolicyOID : LPCSTR
-- pChainContext : CERT_CHAIN_CONTEXT*
-- pPolicyPara : CERT_CHAIN_POLICY_PARA*
-- pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CRYPT32.dll');
const CertVerifyCertificateChainPolicy = lib.func('__stdcall', 'CertVerifyCertificateChainPolicy', 'int32_t', ['str', 'void *', 'void *', 'void *']);
// CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
// pszPolicyOID : LPCSTR -> 'str'
// pChainContext : CERT_CHAIN_CONTEXT* -> 'void *'
// pPolicyPara : CERT_CHAIN_POLICY_PARA* -> 'void *'
// pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CRYPT32.dll", {
  CertVerifyCertificateChainPolicy: { parameters: ["buffer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus)
// pszPolicyOID : LPCSTR -> "buffer"
// pChainContext : CERT_CHAIN_CONTEXT* -> "pointer"
// pPolicyPara : CERT_CHAIN_POLICY_PARA* -> "pointer"
// pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t CertVerifyCertificateChainPolicy(
    const char* pszPolicyOID,
    void* pChainContext,
    void* pPolicyPara,
    void* pPolicyStatus);
C, "CRYPT32.dll");
// $ffi->CertVerifyCertificateChainPolicy(pszPolicyOID, pChainContext, pPolicyPara, pPolicyStatus);
// pszPolicyOID : LPCSTR
// pChainContext : CERT_CHAIN_CONTEXT*
// pPolicyPara : CERT_CHAIN_POLICY_PARA*
// pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Crypt32 extends StdCallLibrary {
    Crypt32 INSTANCE = Native.load("crypt32", Crypt32.class);
    boolean CertVerifyCertificateChainPolicy(
        String pszPolicyOID,   // LPCSTR
        Pointer pChainContext,   // CERT_CHAIN_CONTEXT*
        Pointer pPolicyPara,   // CERT_CHAIN_POLICY_PARA*
        Pointer pPolicyStatus   // CERT_CHAIN_POLICY_STATUS* in/out
    );
}
@[Link("crypt32")]
lib LibCRYPT32
  fun CertVerifyCertificateChainPolicy = CertVerifyCertificateChainPolicy(
    pszPolicyOID : UInt8*,   # LPCSTR
    pChainContext : CERT_CHAIN_CONTEXT*,   # CERT_CHAIN_CONTEXT*
    pPolicyPara : CERT_CHAIN_POLICY_PARA*,   # CERT_CHAIN_POLICY_PARA*
    pPolicyStatus : CERT_CHAIN_POLICY_STATUS*   # CERT_CHAIN_POLICY_STATUS* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CertVerifyCertificateChainPolicyNative = Int32 Function(Pointer<Utf8>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef CertVerifyCertificateChainPolicyDart = int Function(Pointer<Utf8>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final CertVerifyCertificateChainPolicy = DynamicLibrary.open('CRYPT32.dll')
    .lookupFunction<CertVerifyCertificateChainPolicyNative, CertVerifyCertificateChainPolicyDart>('CertVerifyCertificateChainPolicy');
// pszPolicyOID : LPCSTR -> Pointer<Utf8>
// pChainContext : CERT_CHAIN_CONTEXT* -> Pointer<Void>
// pPolicyPara : CERT_CHAIN_POLICY_PARA* -> Pointer<Void>
// pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CertVerifyCertificateChainPolicy(
  pszPolicyOID: PAnsiChar;   // LPCSTR
  pChainContext: Pointer;   // CERT_CHAIN_CONTEXT*
  pPolicyPara: Pointer;   // CERT_CHAIN_POLICY_PARA*
  pPolicyStatus: Pointer   // CERT_CHAIN_POLICY_STATUS* in/out
): BOOL; stdcall;
  external 'CRYPT32.dll' name 'CertVerifyCertificateChainPolicy';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CertVerifyCertificateChainPolicy"
  c_CertVerifyCertificateChainPolicy :: CString -> Ptr () -> Ptr () -> Ptr () -> IO CInt
-- pszPolicyOID : LPCSTR -> CString
-- pChainContext : CERT_CHAIN_CONTEXT* -> Ptr ()
-- pPolicyPara : CERT_CHAIN_POLICY_PARA* -> Ptr ()
-- pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let certverifycertificatechainpolicy =
  foreign "CertVerifyCertificateChainPolicy"
    (string @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* pszPolicyOID : LPCSTR -> string *)
(* pChainContext : CERT_CHAIN_CONTEXT* -> (ptr void) *)
(* pPolicyPara : CERT_CHAIN_POLICY_PARA* -> (ptr void) *)
(* pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library crypt32 (t "CRYPT32.dll"))
(cffi:use-foreign-library crypt32)

(cffi:defcfun ("CertVerifyCertificateChainPolicy" cert-verify-certificate-chain-policy :convention :stdcall) :int32
  (psz-policy-oid :string)   ; LPCSTR
  (p-chain-context :pointer)   ; CERT_CHAIN_CONTEXT*
  (p-policy-para :pointer)   ; CERT_CHAIN_POLICY_PARA*
  (p-policy-status :pointer))   ; CERT_CHAIN_POLICY_STATUS* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CertVerifyCertificateChainPolicy = Win32::API::More->new('CRYPT32',
    'BOOL CertVerifyCertificateChainPolicy(LPCSTR pszPolicyOID, LPVOID pChainContext, LPVOID pPolicyPara, LPVOID pPolicyStatus)');
# my $ret = $CertVerifyCertificateChainPolicy->Call($pszPolicyOID, $pChainContext, $pPolicyPara, $pPolicyStatus);
# pszPolicyOID : LPCSTR -> LPCSTR
# pChainContext : CERT_CHAIN_CONTEXT* -> LPVOID
# pPolicyPara : CERT_CHAIN_POLICY_PARA* -> LPVOID
# pPolicyStatus : CERT_CHAIN_POLICY_STATUS* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型