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

CertVerifyCTLUsage

関数
サブジェクトが指定したCTL使用法に適合するか検証する。
DLLCRYPT32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

BOOL CertVerifyCTLUsage(
    DWORD dwEncodingType,
    DWORD dwSubjectType,
    void* pvSubject,
    CTL_USAGE* pSubjectUsage,
    DWORD dwFlags,
    CTL_VERIFY_USAGE_PARA* pVerifyUsagePara,   // optional
    CTL_VERIFY_USAGE_STATUS* pVerifyUsageStatus
);

パラメーター

名前方向説明
dwEncodingTypeDWORDin

使用するエンコーディングの種類を指定します。現在は X509_ASN_ENCODINGPKCS_7_ASN_ENCODING のみが使用されますが、将来追加のエンコーディングの種類が追加される可能性があります。現在のいずれのエンコーディングの種類についても、次を使用してください。

X509_ASN_ENCODING | PKCS_7_ASN_ENCODING

dwSubjectTypeDWORDin

dwSubjectType パラメーターが CTL_CERT_SUBJECT_TYPE に設定されている場合、pvSubjectCERT_CONTEXT 構造体を指します。この構造体の SubjectAlgorithm メンバーが調べられ、サブジェクトの識別情報の表現方法が決定されます。当初は SubjectAlgorithm の値として SHA1 と MD5 のハッシュのみがサポートされます。該当するハッシュプロパティが CERT_CONTEXT 構造体から取得されます。

dwSubjectType パラメーターが CTL_ANY_SUBJECT_TYPE に設定されている場合、pvSubjectCTL_ANY_SUBJECT_INFO 構造体を指します。この構造体の SubjectAlgorithm メンバーは CTL のアルゴリズムの種類と一致している必要があり、SubjectIdentifier メンバーはいずれかの CTL エントリと一致している必要があります。

dwSubjectType が上記いずれかの値に設定されている場合、dwEncodingType は使用されません。

pvSubjectvoid*indwSubjectType パラメーターと組み合わせて使用される値です。
pSubjectUsageCTL_USAGE*inサブジェクトの想定される使用法を指定するために使用する CTL_USAGE 構造体へのポインターです。
dwFlagsDWORDin

CERT_VERIFY_INHIBIT_CTL_UPDATE_FLAG が設定されていない場合、 CTL_VERIFY_USAGE_PARArghCtlStore で指定されたいずれかのストア内にある、有効期間が切れた CTL が置き換えられることがあります。置き換えられた場合、pVerifyUsageStatusdwFlags メンバーに CERT_VERIFY_UPDATED_CTL_FLAG が設定されます。このフラグが設定されている場合、ストア内にあって有効期間が切れた CTL に対して、有効期間内の更新済み CTL を受信したとしても更新は行われません。

CERT_VERIFY_TRUSTED_SIGNERS_FLAG が設定されている場合、署名者を見つけるために CTL_VERIFY_USAGE_PARArghSignerStore で指定された署名者ストアのみが検索されます。設定されていない場合、署名者ストアは署名者の証明書を見つけるための追加の検索元として利用されます。詳細については「解説」を参照してください。

CERT_VERIFY_NO_TIME_CHECK_FLAG が設定されている場合、CTL の有効期間チェックは行われません。設定されていない場合は行われます。

CERT_VERIFY_ALLOW_MORE_USAGE_FLAG が設定されている場合、CTL は pSubjectUsage で指定された使用法識別子に加えて、その他の使用法識別子を含むことができます。設定されていない場合、見つかった CTL には追加の使用法識別子は含まれません。

pVerifyUsageParaCTL_VERIFY_USAGE_PARA*inoptionalCTL を見つけるために検索するストアと、許容される CTL 署名者を含むストアを指定する CTL_VERIFY_USAGE_PARA 構造体へのポインターです。ListIdentifier メンバーを設定すると、検索がさらに限定されます。
pVerifyUsageStatusCTL_VERIFY_USAGE_STATUS*inoutCTL_VERIFY_USAGE_STATUS 構造体へのポインターです。CertVerifyCTLUsage を呼び出す前に、この構造体の cbSize メンバーを構造体のサイズ (バイト単位) に設定し、その他のすべてのフィールドをゼロに設定する必要があります。詳細については CTL_VERIFY_USAGE_STATUS を参照してください。

戻り値の型: BOOL

公式ドキュメント

使用法識別子を含み、署名され、かつ有効期間内である証明書信頼リスト (CTL: certificate trust list) を検索することで、サブジェクトが指定された使用法において信頼されていることを検証します。

戻り値

サブジェクトが指定された使用法において信頼されている場合は TRUE が返されます。それ以外の場合は FALSE が返されます。GetLastError は次のいずれかのエラーコードを返すことがあります。

説明
CRYPT_E_NO_VERIFY_USAGE_DLL
サブジェクトの使用法を検証するための DLL またはエクスポート関数が見つかりませんでした。
CRYPT_E_NO_VERIFY_USAGE_CHECK
呼び出された関数がサブジェクトに対して使用法チェックを実行できませんでした。
CRYPT_E_VERIFY_USAGE_OFFLINE
サーバーがオフラインであったため、呼び出された関数が使用法チェックを完了できませんでした。
CRYPT_E_NOT_IN_CTL
サブジェクトが CTL 内に見つかりませんでした。
CRYPT_E_NO_TRUSTED_SIGNER
メッセージまたは信頼リストの署名を検証するための信頼された署名者が見つかりませんでした。

pVerifyUsageStatus が指す CTL_VERIFY_USAGE_PARAdwError メンバーには、同じエラーコードが設定されます。

解説(Remarks)

CertVerifyCTLUsage は、オブジェクト識別子 (OID) を使用してインストールできる関数へのディスパッチャーです。まず、pSubjectUsage が指す CLT_USAGE 構造体内の最初の使用法オブジェクト識別子に一致する OID 関数を見つけようとします。これに失敗した場合、既定の CertDllVerifyCTLUsage 関数を使用します。

Cryptnet.dll 内の CertDllVerifyCTLUsage 関数は OID を使用してインストールでき、次の特性を持ちます。

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

各言語での呼び出し定義

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

BOOL CertVerifyCTLUsage(
    DWORD dwEncodingType,
    DWORD dwSubjectType,
    void* pvSubject,
    CTL_USAGE* pSubjectUsage,
    DWORD dwFlags,
    CTL_VERIFY_USAGE_PARA* pVerifyUsagePara,   // optional
    CTL_VERIFY_USAGE_STATUS* pVerifyUsageStatus
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool CertVerifyCTLUsage(
    uint dwEncodingType,   // DWORD
    uint dwSubjectType,   // DWORD
    IntPtr pvSubject,   // void*
    IntPtr pSubjectUsage,   // CTL_USAGE*
    uint dwFlags,   // DWORD
    IntPtr pVerifyUsagePara,   // CTL_VERIFY_USAGE_PARA* optional
    IntPtr pVerifyUsageStatus   // CTL_VERIFY_USAGE_STATUS* in/out
);
<DllImport("CRYPT32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CertVerifyCTLUsage(
    dwEncodingType As UInteger,   ' DWORD
    dwSubjectType As UInteger,   ' DWORD
    pvSubject As IntPtr,   ' void*
    pSubjectUsage As IntPtr,   ' CTL_USAGE*
    dwFlags As UInteger,   ' DWORD
    pVerifyUsagePara As IntPtr,   ' CTL_VERIFY_USAGE_PARA* optional
    pVerifyUsageStatus As IntPtr   ' CTL_VERIFY_USAGE_STATUS* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' dwEncodingType : DWORD
' dwSubjectType : DWORD
' pvSubject : void*
' pSubjectUsage : CTL_USAGE*
' dwFlags : DWORD
' pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional
' pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out
Declare PtrSafe Function CertVerifyCTLUsage Lib "crypt32" ( _
    ByVal dwEncodingType As Long, _
    ByVal dwSubjectType As Long, _
    ByVal pvSubject As LongPtr, _
    ByVal pSubjectUsage As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal pVerifyUsagePara As LongPtr, _
    ByVal pVerifyUsageStatus As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CertVerifyCTLUsage = ctypes.windll.crypt32.CertVerifyCTLUsage
CertVerifyCTLUsage.restype = wintypes.BOOL
CertVerifyCTLUsage.argtypes = [
    wintypes.DWORD,  # dwEncodingType : DWORD
    wintypes.DWORD,  # dwSubjectType : DWORD
    ctypes.POINTER(None),  # pvSubject : void*
    ctypes.c_void_p,  # pSubjectUsage : CTL_USAGE*
    wintypes.DWORD,  # dwFlags : DWORD
    ctypes.c_void_p,  # pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional
    ctypes.c_void_p,  # pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPT32.dll')
CertVerifyCTLUsage = Fiddle::Function.new(
  lib['CertVerifyCTLUsage'],
  [
    -Fiddle::TYPE_INT,  # dwEncodingType : DWORD
    -Fiddle::TYPE_INT,  # dwSubjectType : DWORD
    Fiddle::TYPE_VOIDP,  # pvSubject : void*
    Fiddle::TYPE_VOIDP,  # pSubjectUsage : CTL_USAGE*
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_VOIDP,  # pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional
    Fiddle::TYPE_VOIDP,  # pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "crypt32")]
extern "system" {
    fn CertVerifyCTLUsage(
        dwEncodingType: u32,  // DWORD
        dwSubjectType: u32,  // DWORD
        pvSubject: *mut (),  // void*
        pSubjectUsage: *mut CTL_USAGE,  // CTL_USAGE*
        dwFlags: u32,  // DWORD
        pVerifyUsagePara: *mut CTL_VERIFY_USAGE_PARA,  // CTL_VERIFY_USAGE_PARA* optional
        pVerifyUsageStatus: *mut CTL_VERIFY_USAGE_STATUS  // CTL_VERIFY_USAGE_STATUS* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll", SetLastError = true)]
public static extern bool CertVerifyCTLUsage(uint dwEncodingType, uint dwSubjectType, IntPtr pvSubject, IntPtr pSubjectUsage, uint dwFlags, IntPtr pVerifyUsagePara, IntPtr pVerifyUsageStatus);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CertVerifyCTLUsage' -Namespace Win32 -PassThru
# $api::CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
#uselib "CRYPT32.dll"
#func global CertVerifyCTLUsage "CertVerifyCTLUsage" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CertVerifyCTLUsage dwEncodingType, dwSubjectType, pvSubject, varptr(pSubjectUsage), dwFlags, varptr(pVerifyUsagePara), varptr(pVerifyUsageStatus)   ; 戻り値は stat
; dwEncodingType : DWORD -> "sptr"
; dwSubjectType : DWORD -> "sptr"
; pvSubject : void* -> "sptr"
; pSubjectUsage : CTL_USAGE* -> "sptr"
; dwFlags : DWORD -> "sptr"
; pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> "sptr"
; pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "CRYPT32.dll"
#cfunc global CertVerifyCTLUsage "CertVerifyCTLUsage" int, int, sptr, var, int, var, var
; res = CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
; dwEncodingType : DWORD -> "int"
; dwSubjectType : DWORD -> "int"
; pvSubject : void* -> "sptr"
; pSubjectUsage : CTL_USAGE* -> "var"
; dwFlags : DWORD -> "int"
; pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> "var"
; pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL CertVerifyCTLUsage(DWORD dwEncodingType, DWORD dwSubjectType, void* pvSubject, CTL_USAGE* pSubjectUsage, DWORD dwFlags, CTL_VERIFY_USAGE_PARA* pVerifyUsagePara, CTL_VERIFY_USAGE_STATUS* pVerifyUsageStatus)
#uselib "CRYPT32.dll"
#cfunc global CertVerifyCTLUsage "CertVerifyCTLUsage" int, int, intptr, var, int, var, var
; res = CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
; dwEncodingType : DWORD -> "int"
; dwSubjectType : DWORD -> "int"
; pvSubject : void* -> "intptr"
; pSubjectUsage : CTL_USAGE* -> "var"
; dwFlags : DWORD -> "int"
; pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> "var"
; pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
	procCertVerifyCTLUsage = crypt32.NewProc("CertVerifyCTLUsage")
)

// dwEncodingType (DWORD), dwSubjectType (DWORD), pvSubject (void*), pSubjectUsage (CTL_USAGE*), dwFlags (DWORD), pVerifyUsagePara (CTL_VERIFY_USAGE_PARA* optional), pVerifyUsageStatus (CTL_VERIFY_USAGE_STATUS* in/out)
r1, _, err := procCertVerifyCTLUsage.Call(
	uintptr(dwEncodingType),
	uintptr(dwSubjectType),
	uintptr(pvSubject),
	uintptr(pSubjectUsage),
	uintptr(dwFlags),
	uintptr(pVerifyUsagePara),
	uintptr(pVerifyUsageStatus),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function CertVerifyCTLUsage(
  dwEncodingType: DWORD;   // DWORD
  dwSubjectType: DWORD;   // DWORD
  pvSubject: Pointer;   // void*
  pSubjectUsage: Pointer;   // CTL_USAGE*
  dwFlags: DWORD;   // DWORD
  pVerifyUsagePara: Pointer;   // CTL_VERIFY_USAGE_PARA* optional
  pVerifyUsageStatus: Pointer   // CTL_VERIFY_USAGE_STATUS* in/out
): BOOL; stdcall;
  external 'CRYPT32.dll' name 'CertVerifyCTLUsage';
result := DllCall("CRYPT32\CertVerifyCTLUsage"
    , "UInt", dwEncodingType   ; DWORD
    , "UInt", dwSubjectType   ; DWORD
    , "Ptr", pvSubject   ; void*
    , "Ptr", pSubjectUsage   ; CTL_USAGE*
    , "UInt", dwFlags   ; DWORD
    , "Ptr", pVerifyUsagePara   ; CTL_VERIFY_USAGE_PARA* optional
    , "Ptr", pVerifyUsageStatus   ; CTL_VERIFY_USAGE_STATUS* in/out
    , "Int")   ; return: BOOL
●CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus) = DLL("CRYPT32.dll", "bool CertVerifyCTLUsage(dword, dword, void*, void*, dword, void*, void*)")
# 呼び出し: CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
# dwEncodingType : DWORD -> "dword"
# dwSubjectType : DWORD -> "dword"
# pvSubject : void* -> "void*"
# pSubjectUsage : CTL_USAGE* -> "void*"
# dwFlags : DWORD -> "dword"
# pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> "void*"
# pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "crypt32" fn CertVerifyCTLUsage(
    dwEncodingType: u32, // DWORD
    dwSubjectType: u32, // DWORD
    pvSubject: ?*anyopaque, // void*
    pSubjectUsage: [*c]CTL_USAGE, // CTL_USAGE*
    dwFlags: u32, // DWORD
    pVerifyUsagePara: [*c]CTL_VERIFY_USAGE_PARA, // CTL_VERIFY_USAGE_PARA* optional
    pVerifyUsageStatus: [*c]CTL_VERIFY_USAGE_STATUS // CTL_VERIFY_USAGE_STATUS* in/out
) callconv(std.os.windows.WINAPI) i32;
proc CertVerifyCTLUsage(
    dwEncodingType: uint32,  # DWORD
    dwSubjectType: uint32,  # DWORD
    pvSubject: pointer,  # void*
    pSubjectUsage: ptr CTL_USAGE,  # CTL_USAGE*
    dwFlags: uint32,  # DWORD
    pVerifyUsagePara: ptr CTL_VERIFY_USAGE_PARA,  # CTL_VERIFY_USAGE_PARA* optional
    pVerifyUsageStatus: ptr CTL_VERIFY_USAGE_STATUS  # CTL_VERIFY_USAGE_STATUS* in/out
): int32 {.importc: "CertVerifyCTLUsage", stdcall, dynlib: "CRYPT32.dll".}
pragma(lib, "crypt32");
extern(Windows)
int CertVerifyCTLUsage(
    uint dwEncodingType,   // DWORD
    uint dwSubjectType,   // DWORD
    void* pvSubject,   // void*
    CTL_USAGE* pSubjectUsage,   // CTL_USAGE*
    uint dwFlags,   // DWORD
    CTL_VERIFY_USAGE_PARA* pVerifyUsagePara,   // CTL_VERIFY_USAGE_PARA* optional
    CTL_VERIFY_USAGE_STATUS* pVerifyUsageStatus   // CTL_VERIFY_USAGE_STATUS* in/out
);
ccall((:CertVerifyCTLUsage, "CRYPT32.dll"), stdcall, Int32,
      (UInt32, UInt32, Ptr{Cvoid}, Ptr{CTL_USAGE}, UInt32, Ptr{CTL_VERIFY_USAGE_PARA}, Ptr{CTL_VERIFY_USAGE_STATUS}),
      dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
# dwEncodingType : DWORD -> UInt32
# dwSubjectType : DWORD -> UInt32
# pvSubject : void* -> Ptr{Cvoid}
# pSubjectUsage : CTL_USAGE* -> Ptr{CTL_USAGE}
# dwFlags : DWORD -> UInt32
# pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> Ptr{CTL_VERIFY_USAGE_PARA}
# pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> Ptr{CTL_VERIFY_USAGE_STATUS}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t CertVerifyCTLUsage(
    uint32_t dwEncodingType,
    uint32_t dwSubjectType,
    void* pvSubject,
    void* pSubjectUsage,
    uint32_t dwFlags,
    void* pVerifyUsagePara,
    void* pVerifyUsageStatus);
]]
local crypt32 = ffi.load("crypt32")
-- crypt32.CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
-- dwEncodingType : DWORD
-- dwSubjectType : DWORD
-- pvSubject : void*
-- pSubjectUsage : CTL_USAGE*
-- dwFlags : DWORD
-- pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional
-- pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('CRYPT32.dll');
const CertVerifyCTLUsage = lib.func('__stdcall', 'CertVerifyCTLUsage', 'int32_t', ['uint32_t', 'uint32_t', 'void *', 'void *', 'uint32_t', 'void *', 'void *']);
// CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
// dwEncodingType : DWORD -> 'uint32_t'
// dwSubjectType : DWORD -> 'uint32_t'
// pvSubject : void* -> 'void *'
// pSubjectUsage : CTL_USAGE* -> 'void *'
// dwFlags : DWORD -> 'uint32_t'
// pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> 'void *'
// pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("CRYPT32.dll", {
  CertVerifyCTLUsage: { parameters: ["u32", "u32", "pointer", "pointer", "u32", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus)
// dwEncodingType : DWORD -> "u32"
// dwSubjectType : DWORD -> "u32"
// pvSubject : void* -> "pointer"
// pSubjectUsage : CTL_USAGE* -> "pointer"
// dwFlags : DWORD -> "u32"
// pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> "pointer"
// pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t CertVerifyCTLUsage(
    uint32_t dwEncodingType,
    uint32_t dwSubjectType,
    void* pvSubject,
    void* pSubjectUsage,
    uint32_t dwFlags,
    void* pVerifyUsagePara,
    void* pVerifyUsageStatus);
C, "CRYPT32.dll");
// $ffi->CertVerifyCTLUsage(dwEncodingType, dwSubjectType, pvSubject, pSubjectUsage, dwFlags, pVerifyUsagePara, pVerifyUsageStatus);
// dwEncodingType : DWORD
// dwSubjectType : DWORD
// pvSubject : void*
// pSubjectUsage : CTL_USAGE*
// dwFlags : DWORD
// pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional
// pVerifyUsageStatus : CTL_VERIFY_USAGE_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 CertVerifyCTLUsage(
        int dwEncodingType,   // DWORD
        int dwSubjectType,   // DWORD
        Pointer pvSubject,   // void*
        Pointer pSubjectUsage,   // CTL_USAGE*
        int dwFlags,   // DWORD
        Pointer pVerifyUsagePara,   // CTL_VERIFY_USAGE_PARA* optional
        Pointer pVerifyUsageStatus   // CTL_VERIFY_USAGE_STATUS* in/out
    );
}
@[Link("crypt32")]
lib LibCRYPT32
  fun CertVerifyCTLUsage = CertVerifyCTLUsage(
    dwEncodingType : UInt32,   # DWORD
    dwSubjectType : UInt32,   # DWORD
    pvSubject : Void*,   # void*
    pSubjectUsage : CTL_USAGE*,   # CTL_USAGE*
    dwFlags : UInt32,   # DWORD
    pVerifyUsagePara : CTL_VERIFY_USAGE_PARA*,   # CTL_VERIFY_USAGE_PARA* optional
    pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS*   # CTL_VERIFY_USAGE_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 CertVerifyCTLUsageNative = Int32 Function(Uint32, Uint32, Pointer<Void>, Pointer<Void>, Uint32, Pointer<Void>, Pointer<Void>);
typedef CertVerifyCTLUsageDart = int Function(int, int, Pointer<Void>, Pointer<Void>, int, Pointer<Void>, Pointer<Void>);
final CertVerifyCTLUsage = DynamicLibrary.open('CRYPT32.dll')
    .lookupFunction<CertVerifyCTLUsageNative, CertVerifyCTLUsageDart>('CertVerifyCTLUsage');
// dwEncodingType : DWORD -> Uint32
// dwSubjectType : DWORD -> Uint32
// pvSubject : void* -> Pointer<Void>
// pSubjectUsage : CTL_USAGE* -> Pointer<Void>
// dwFlags : DWORD -> Uint32
// pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> Pointer<Void>
// pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CertVerifyCTLUsage(
  dwEncodingType: DWORD;   // DWORD
  dwSubjectType: DWORD;   // DWORD
  pvSubject: Pointer;   // void*
  pSubjectUsage: Pointer;   // CTL_USAGE*
  dwFlags: DWORD;   // DWORD
  pVerifyUsagePara: Pointer;   // CTL_VERIFY_USAGE_PARA* optional
  pVerifyUsageStatus: Pointer   // CTL_VERIFY_USAGE_STATUS* in/out
): BOOL; stdcall;
  external 'CRYPT32.dll' name 'CertVerifyCTLUsage';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CertVerifyCTLUsage"
  c_CertVerifyCTLUsage :: Word32 -> Word32 -> Ptr () -> Ptr () -> Word32 -> Ptr () -> Ptr () -> IO CInt
-- dwEncodingType : DWORD -> Word32
-- dwSubjectType : DWORD -> Word32
-- pvSubject : void* -> Ptr ()
-- pSubjectUsage : CTL_USAGE* -> Ptr ()
-- dwFlags : DWORD -> Word32
-- pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> Ptr ()
-- pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let certverifyctlusage =
  foreign "CertVerifyCTLUsage"
    (uint32_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* dwEncodingType : DWORD -> uint32_t *)
(* dwSubjectType : DWORD -> uint32_t *)
(* pvSubject : void* -> (ptr void) *)
(* pSubjectUsage : CTL_USAGE* -> (ptr void) *)
(* dwFlags : DWORD -> uint32_t *)
(* pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> (ptr void) *)
(* pVerifyUsageStatus : CTL_VERIFY_USAGE_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 ("CertVerifyCTLUsage" cert-verify-ctlusage :convention :stdcall) :int32
  (dw-encoding-type :uint32)   ; DWORD
  (dw-subject-type :uint32)   ; DWORD
  (pv-subject :pointer)   ; void*
  (p-subject-usage :pointer)   ; CTL_USAGE*
  (dw-flags :uint32)   ; DWORD
  (p-verify-usage-para :pointer)   ; CTL_VERIFY_USAGE_PARA* optional
  (p-verify-usage-status :pointer))   ; CTL_VERIFY_USAGE_STATUS* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CertVerifyCTLUsage = Win32::API::More->new('CRYPT32',
    'BOOL CertVerifyCTLUsage(DWORD dwEncodingType, DWORD dwSubjectType, LPVOID pvSubject, LPVOID pSubjectUsage, DWORD dwFlags, LPVOID pVerifyUsagePara, LPVOID pVerifyUsageStatus)');
# my $ret = $CertVerifyCTLUsage->Call($dwEncodingType, $dwSubjectType, $pvSubject, $pSubjectUsage, $dwFlags, $pVerifyUsagePara, $pVerifyUsageStatus);
# dwEncodingType : DWORD -> DWORD
# dwSubjectType : DWORD -> DWORD
# pvSubject : void* -> LPVOID
# pSubjectUsage : CTL_USAGE* -> LPVOID
# dwFlags : DWORD -> DWORD
# pVerifyUsagePara : CTL_VERIFY_USAGE_PARA* optional -> LPVOID
# pVerifyUsageStatus : CTL_VERIFY_USAGE_STATUS* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型