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

CRYPT_PROVIDER_FUNCTIONS

構造体
サイズx64: 128 バイト / x86: 64 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
cbStructDWORD4+0+0この構造体のサイズ (バイト単位)。
pfnAllocPFN_CPD_MEM_ALLOC8/4+8+4メモリ割り当て関数へのポインター。
pfnFreePFN_CPD_MEM_FREE8/4+16+8メモリ解放関数へのポインター。
pfnAddStore2ChainPFN_CPD_ADD_STORE8/4+24+12チェーンにストアを追加する関数へのポインター。
pfnAddSgnr2ChainPFN_CPD_ADD_SGNR8/4+32+16チェーン内のメッセージ構造体に署名者構造体を追加する関数へのポインター。
pfnAddCert2ChainPFN_CPD_ADD_CERT8/4+40+20チェーン内の署名者構造体に証明書構造体を追加する関数へのポインター。
pfnAddPrivData2ChainPFN_CPD_ADD_PRIVDATA8/4+48+24構造体にプライベート データを追加する関数へのポインター。
pfnInitializePFN_PROVIDER_INIT_CALL8/4+56+28ポリシー データを初期化する関数へのポインター。
pfnObjectTrustPFN_PROVIDER_OBJTRUST_CALL8/4+64+32署名者データの情報を構築する関数へのポインター。
pfnSignatureTrustPFN_PROVIDER_SIGTRUST_CALL8/4+72+36署名証明書の情報を構築する関数へのポインター。
pfnCertificateTrustPFN_PROVIDER_CERTTRUST_CALL8/4+80+40チェーンを構築する関数へのポインター。
pfnFinalPolicyPFN_PROVIDER_FINALPOLICY_CALL8/4+88+44ポリシーへの最終呼び出しを行う関数へのポインター。
pfnCertCheckPolicyPFN_PROVIDER_CERTCHKPOLICY_CALL8/4+96+48チェーンの構築中に各証明書を確認する関数へのポインター。
pfnTestFinalPolicyPFN_PROVIDER_TESTFINALPOLICY_CALL8/4+104+52構造体をファイルにダンプできるようにする関数へのポインター。
psUIpfnsCRYPT_PROVUI_FUNCS*8/4+112+56CRYPT_PROVUI_FUNCS 構造体へのポインター。
pfnCleanupPolicyPFN_PROVIDER_CLEANUP_CALL8/4+120+60プライベート データをクリーンアップする関数へのポインター。

公式ドキュメント

[CRYPT_PROVIDER_FUNCTIONS 構造体は、要件セクションで指定されているオペレーティング システムで使用できます。以降のバージョンでは変更されるか、使用できなくなる可能性があります。]

CRYPT_PROVIDER_FUNCTIONS 構造体は、WinTrust 操作でクリプトグラフィック サービス プロバイダー (CSP) が使用する関数を定義します。

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

各言語での定義

#include <windows.h>

// CRYPT_PROVIDER_FUNCTIONS  (x64 128 / x86 64 バイト)
typedef struct CRYPT_PROVIDER_FUNCTIONS {
    DWORD cbStruct;
    PFN_CPD_MEM_ALLOC pfnAlloc;
    PFN_CPD_MEM_FREE pfnFree;
    PFN_CPD_ADD_STORE pfnAddStore2Chain;
    PFN_CPD_ADD_SGNR pfnAddSgnr2Chain;
    PFN_CPD_ADD_CERT pfnAddCert2Chain;
    PFN_CPD_ADD_PRIVDATA pfnAddPrivData2Chain;
    PFN_PROVIDER_INIT_CALL pfnInitialize;
    PFN_PROVIDER_OBJTRUST_CALL pfnObjectTrust;
    PFN_PROVIDER_SIGTRUST_CALL pfnSignatureTrust;
    PFN_PROVIDER_CERTTRUST_CALL pfnCertificateTrust;
    PFN_PROVIDER_FINALPOLICY_CALL pfnFinalPolicy;
    PFN_PROVIDER_CERTCHKPOLICY_CALL pfnCertCheckPolicy;
    PFN_PROVIDER_TESTFINALPOLICY_CALL pfnTestFinalPolicy;
    CRYPT_PROVUI_FUNCS* psUIpfns;
    PFN_PROVIDER_CLEANUP_CALL pfnCleanupPolicy;
} CRYPT_PROVIDER_FUNCTIONS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_PROVIDER_FUNCTIONS
{
    public uint cbStruct;
    public IntPtr pfnAlloc;
    public IntPtr pfnFree;
    public IntPtr pfnAddStore2Chain;
    public IntPtr pfnAddSgnr2Chain;
    public IntPtr pfnAddCert2Chain;
    public IntPtr pfnAddPrivData2Chain;
    public IntPtr pfnInitialize;
    public IntPtr pfnObjectTrust;
    public IntPtr pfnSignatureTrust;
    public IntPtr pfnCertificateTrust;
    public IntPtr pfnFinalPolicy;
    public IntPtr pfnCertCheckPolicy;
    public IntPtr pfnTestFinalPolicy;
    public IntPtr psUIpfns;
    public IntPtr pfnCleanupPolicy;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_PROVIDER_FUNCTIONS
    Public cbStruct As UInteger
    Public pfnAlloc As IntPtr
    Public pfnFree As IntPtr
    Public pfnAddStore2Chain As IntPtr
    Public pfnAddSgnr2Chain As IntPtr
    Public pfnAddCert2Chain As IntPtr
    Public pfnAddPrivData2Chain As IntPtr
    Public pfnInitialize As IntPtr
    Public pfnObjectTrust As IntPtr
    Public pfnSignatureTrust As IntPtr
    Public pfnCertificateTrust As IntPtr
    Public pfnFinalPolicy As IntPtr
    Public pfnCertCheckPolicy As IntPtr
    Public pfnTestFinalPolicy As IntPtr
    Public psUIpfns As IntPtr
    Public pfnCleanupPolicy As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class CRYPT_PROVIDER_FUNCTIONS(ctypes.Structure):
    _fields_ = [
        ("cbStruct", wintypes.DWORD),
        ("pfnAlloc", ctypes.c_void_p),
        ("pfnFree", ctypes.c_void_p),
        ("pfnAddStore2Chain", ctypes.c_void_p),
        ("pfnAddSgnr2Chain", ctypes.c_void_p),
        ("pfnAddCert2Chain", ctypes.c_void_p),
        ("pfnAddPrivData2Chain", ctypes.c_void_p),
        ("pfnInitialize", ctypes.c_void_p),
        ("pfnObjectTrust", ctypes.c_void_p),
        ("pfnSignatureTrust", ctypes.c_void_p),
        ("pfnCertificateTrust", ctypes.c_void_p),
        ("pfnFinalPolicy", ctypes.c_void_p),
        ("pfnCertCheckPolicy", ctypes.c_void_p),
        ("pfnTestFinalPolicy", ctypes.c_void_p),
        ("psUIpfns", ctypes.c_void_p),
        ("pfnCleanupPolicy", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct CRYPT_PROVIDER_FUNCTIONS {
    pub cbStruct: u32,
    pub pfnAlloc: *mut core::ffi::c_void,
    pub pfnFree: *mut core::ffi::c_void,
    pub pfnAddStore2Chain: *mut core::ffi::c_void,
    pub pfnAddSgnr2Chain: *mut core::ffi::c_void,
    pub pfnAddCert2Chain: *mut core::ffi::c_void,
    pub pfnAddPrivData2Chain: *mut core::ffi::c_void,
    pub pfnInitialize: *mut core::ffi::c_void,
    pub pfnObjectTrust: *mut core::ffi::c_void,
    pub pfnSignatureTrust: *mut core::ffi::c_void,
    pub pfnCertificateTrust: *mut core::ffi::c_void,
    pub pfnFinalPolicy: *mut core::ffi::c_void,
    pub pfnCertCheckPolicy: *mut core::ffi::c_void,
    pub pfnTestFinalPolicy: *mut core::ffi::c_void,
    pub psUIpfns: *mut core::ffi::c_void,
    pub pfnCleanupPolicy: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type CRYPT_PROVIDER_FUNCTIONS struct {
	cbStruct uint32
	pfnAlloc uintptr
	pfnFree uintptr
	pfnAddStore2Chain uintptr
	pfnAddSgnr2Chain uintptr
	pfnAddCert2Chain uintptr
	pfnAddPrivData2Chain uintptr
	pfnInitialize uintptr
	pfnObjectTrust uintptr
	pfnSignatureTrust uintptr
	pfnCertificateTrust uintptr
	pfnFinalPolicy uintptr
	pfnCertCheckPolicy uintptr
	pfnTestFinalPolicy uintptr
	psUIpfns uintptr
	pfnCleanupPolicy uintptr
}
type
  CRYPT_PROVIDER_FUNCTIONS = record
    cbStruct: DWORD;
    pfnAlloc: Pointer;
    pfnFree: Pointer;
    pfnAddStore2Chain: Pointer;
    pfnAddSgnr2Chain: Pointer;
    pfnAddCert2Chain: Pointer;
    pfnAddPrivData2Chain: Pointer;
    pfnInitialize: Pointer;
    pfnObjectTrust: Pointer;
    pfnSignatureTrust: Pointer;
    pfnCertificateTrust: Pointer;
    pfnFinalPolicy: Pointer;
    pfnCertCheckPolicy: Pointer;
    pfnTestFinalPolicy: Pointer;
    psUIpfns: Pointer;
    pfnCleanupPolicy: Pointer;
  end;
const CRYPT_PROVIDER_FUNCTIONS = extern struct {
    cbStruct: u32,
    pfnAlloc: ?*anyopaque,
    pfnFree: ?*anyopaque,
    pfnAddStore2Chain: ?*anyopaque,
    pfnAddSgnr2Chain: ?*anyopaque,
    pfnAddCert2Chain: ?*anyopaque,
    pfnAddPrivData2Chain: ?*anyopaque,
    pfnInitialize: ?*anyopaque,
    pfnObjectTrust: ?*anyopaque,
    pfnSignatureTrust: ?*anyopaque,
    pfnCertificateTrust: ?*anyopaque,
    pfnFinalPolicy: ?*anyopaque,
    pfnCertCheckPolicy: ?*anyopaque,
    pfnTestFinalPolicy: ?*anyopaque,
    psUIpfns: ?*anyopaque,
    pfnCleanupPolicy: ?*anyopaque,
};
type
  CRYPT_PROVIDER_FUNCTIONS {.bycopy.} = object
    cbStruct: uint32
    pfnAlloc: pointer
    pfnFree: pointer
    pfnAddStore2Chain: pointer
    pfnAddSgnr2Chain: pointer
    pfnAddCert2Chain: pointer
    pfnAddPrivData2Chain: pointer
    pfnInitialize: pointer
    pfnObjectTrust: pointer
    pfnSignatureTrust: pointer
    pfnCertificateTrust: pointer
    pfnFinalPolicy: pointer
    pfnCertCheckPolicy: pointer
    pfnTestFinalPolicy: pointer
    psUIpfns: pointer
    pfnCleanupPolicy: pointer
struct CRYPT_PROVIDER_FUNCTIONS
{
    uint cbStruct;
    void* pfnAlloc;
    void* pfnFree;
    void* pfnAddStore2Chain;
    void* pfnAddSgnr2Chain;
    void* pfnAddCert2Chain;
    void* pfnAddPrivData2Chain;
    void* pfnInitialize;
    void* pfnObjectTrust;
    void* pfnSignatureTrust;
    void* pfnCertificateTrust;
    void* pfnFinalPolicy;
    void* pfnCertCheckPolicy;
    void* pfnTestFinalPolicy;
    void* psUIpfns;
    void* pfnCleanupPolicy;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CRYPT_PROVIDER_FUNCTIONS サイズ: 64 バイト(x86)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pfnAlloc : PFN_CPD_MEM_ALLOC (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pfnFree : PFN_CPD_MEM_FREE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; pfnAddStore2Chain : PFN_CPD_ADD_STORE (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; pfnAddSgnr2Chain : PFN_CPD_ADD_SGNR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pfnAddCert2Chain : PFN_CPD_ADD_CERT (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; pfnAddPrivData2Chain : PFN_CPD_ADD_PRIVDATA (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; pfnInitialize : PFN_PROVIDER_INIT_CALL (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; pfnObjectTrust : PFN_PROVIDER_OBJTRUST_CALL (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pfnSignatureTrust : PFN_PROVIDER_SIGTRUST_CALL (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; pfnCertificateTrust : PFN_PROVIDER_CERTTRUST_CALL (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; pfnFinalPolicy : PFN_PROVIDER_FINALPOLICY_CALL (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; pfnCertCheckPolicy : PFN_PROVIDER_CERTCHKPOLICY_CALL (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; pfnTestFinalPolicy : PFN_PROVIDER_TESTFINALPOLICY_CALL (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; psUIpfns : CRYPT_PROVUI_FUNCS* (+56, 4byte)  varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; pfnCleanupPolicy : PFN_PROVIDER_CLEANUP_CALL (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CRYPT_PROVIDER_FUNCTIONS サイズ: 128 バイト(x64)
dim st, 32    ; 4byte整数×32(構造体サイズ 128 / 4 切り上げ)
; cbStruct : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pfnAlloc : PFN_CPD_MEM_ALLOC (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; pfnFree : PFN_CPD_MEM_FREE (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; pfnAddStore2Chain : PFN_CPD_ADD_STORE (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; pfnAddSgnr2Chain : PFN_CPD_ADD_SGNR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; pfnAddCert2Chain : PFN_CPD_ADD_CERT (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; pfnAddPrivData2Chain : PFN_CPD_ADD_PRIVDATA (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; pfnInitialize : PFN_PROVIDER_INIT_CALL (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; pfnObjectTrust : PFN_PROVIDER_OBJTRUST_CALL (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; pfnSignatureTrust : PFN_PROVIDER_SIGTRUST_CALL (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; pfnCertificateTrust : PFN_PROVIDER_CERTTRUST_CALL (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; pfnFinalPolicy : PFN_PROVIDER_FINALPOLICY_CALL (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; pfnCertCheckPolicy : PFN_PROVIDER_CERTCHKPOLICY_CALL (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; pfnTestFinalPolicy : PFN_PROVIDER_TESTFINALPOLICY_CALL (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; psUIpfns : CRYPT_PROVUI_FUNCS* (+112, 8byte)  varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; pfnCleanupPolicy : PFN_PROVIDER_CLEANUP_CALL (+120, 8byte)  qpoke st,120,値 / qpeek(st,120)  ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CRYPT_PROVIDER_FUNCTIONS
    #field int cbStruct
    #field intptr pfnAlloc
    #field intptr pfnFree
    #field intptr pfnAddStore2Chain
    #field intptr pfnAddSgnr2Chain
    #field intptr pfnAddCert2Chain
    #field intptr pfnAddPrivData2Chain
    #field intptr pfnInitialize
    #field intptr pfnObjectTrust
    #field intptr pfnSignatureTrust
    #field intptr pfnCertificateTrust
    #field intptr pfnFinalPolicy
    #field intptr pfnCertCheckPolicy
    #field intptr pfnTestFinalPolicy
    #field intptr psUIpfns
    #field intptr pfnCleanupPolicy
#endstruct

stdim st, CRYPT_PROVIDER_FUNCTIONS        ; NSTRUCT 変数を確保
st->cbStruct = 100
mes "cbStruct=" + st->cbStruct