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

BCRYPT_SIGNATURE_FUNCTION_TABLE

構造体
サイズx64: 96 バイト / x86: 48 バイト

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

フィールド

フィールドサイズx64x86説明
VersionBCRYPT_INTERFACE_VERSION4+0+0CNG署名インターフェイスのバージョン。
OpenAlgorithmProviderBCryptOpenAlgorithmProviderFn8/4+8+4アルゴリズムプロバイダーを開く関数ポインタ。
GetPropertyBCryptGetPropertyFn8/4+16+8プロパティを取得する関数ポインタ。
SetPropertyBCryptSetPropertyFn8/4+24+12プロパティを設定する関数ポインタ。
CloseAlgorithmProviderBCryptCloseAlgorithmProviderFn8/4+32+16アルゴリズムプロバイダーを閉じる関数ポインタ。
GenerateKeyPairBCryptGenerateKeyPairFn8/4+40+20鍵ペアを生成する関数ポインタ。
FinalizeKeyPairBCryptFinalizeKeyPairFn8/4+48+24鍵ペア生成を確定する関数ポインタ。
SignHashBCryptSignHashFn8/4+56+28ハッシュに署名する関数ポインタ。
VerifySignatureBCryptVerifySignatureFn8/4+64+32署名を検証する関数ポインタ。
ImportKeyPairBCryptImportKeyPairFn8/4+72+36鍵ペアをインポートする関数ポインタ。
ExportKeyBCryptExportKeyFn8/4+80+40鍵をエクスポートする関数ポインタ。
DestroyKeyBCryptDestroyKeyFn8/4+88+44鍵を破棄する関数ポインタ。

各言語での定義

#include <windows.h>

// BCRYPT_INTERFACE_VERSION  (x64 4 / x86 4 バイト)
typedef struct BCRYPT_INTERFACE_VERSION {
    WORD MajorVersion;
    WORD MinorVersion;
} BCRYPT_INTERFACE_VERSION;

// BCRYPT_SIGNATURE_FUNCTION_TABLE  (x64 96 / x86 48 バイト)
typedef struct BCRYPT_SIGNATURE_FUNCTION_TABLE {
    BCRYPT_INTERFACE_VERSION Version;
    BCryptOpenAlgorithmProviderFn OpenAlgorithmProvider;
    BCryptGetPropertyFn GetProperty;
    BCryptSetPropertyFn SetProperty;
    BCryptCloseAlgorithmProviderFn CloseAlgorithmProvider;
    BCryptGenerateKeyPairFn GenerateKeyPair;
    BCryptFinalizeKeyPairFn FinalizeKeyPair;
    BCryptSignHashFn SignHash;
    BCryptVerifySignatureFn VerifySignature;
    BCryptImportKeyPairFn ImportKeyPair;
    BCryptExportKeyFn ExportKey;
    BCryptDestroyKeyFn DestroyKey;
} BCRYPT_SIGNATURE_FUNCTION_TABLE;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct BCRYPT_INTERFACE_VERSION
{
    public ushort MajorVersion;
    public ushort MinorVersion;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct BCRYPT_SIGNATURE_FUNCTION_TABLE
{
    public BCRYPT_INTERFACE_VERSION Version;
    public IntPtr OpenAlgorithmProvider;
    public IntPtr GetProperty;
    public IntPtr SetProperty;
    public IntPtr CloseAlgorithmProvider;
    public IntPtr GenerateKeyPair;
    public IntPtr FinalizeKeyPair;
    public IntPtr SignHash;
    public IntPtr VerifySignature;
    public IntPtr ImportKeyPair;
    public IntPtr ExportKey;
    public IntPtr DestroyKey;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure BCRYPT_INTERFACE_VERSION
    Public MajorVersion As UShort
    Public MinorVersion As UShort
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure BCRYPT_SIGNATURE_FUNCTION_TABLE
    Public Version As BCRYPT_INTERFACE_VERSION
    Public OpenAlgorithmProvider As IntPtr
    Public GetProperty As IntPtr
    Public SetProperty As IntPtr
    Public CloseAlgorithmProvider As IntPtr
    Public GenerateKeyPair As IntPtr
    Public FinalizeKeyPair As IntPtr
    Public SignHash As IntPtr
    Public VerifySignature As IntPtr
    Public ImportKeyPair As IntPtr
    Public ExportKey As IntPtr
    Public DestroyKey As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class BCRYPT_INTERFACE_VERSION(ctypes.Structure):
    _fields_ = [
        ("MajorVersion", ctypes.c_ushort),
        ("MinorVersion", ctypes.c_ushort),
    ]

class BCRYPT_SIGNATURE_FUNCTION_TABLE(ctypes.Structure):
    _fields_ = [
        ("Version", BCRYPT_INTERFACE_VERSION),
        ("OpenAlgorithmProvider", ctypes.c_void_p),
        ("GetProperty", ctypes.c_void_p),
        ("SetProperty", ctypes.c_void_p),
        ("CloseAlgorithmProvider", ctypes.c_void_p),
        ("GenerateKeyPair", ctypes.c_void_p),
        ("FinalizeKeyPair", ctypes.c_void_p),
        ("SignHash", ctypes.c_void_p),
        ("VerifySignature", ctypes.c_void_p),
        ("ImportKeyPair", ctypes.c_void_p),
        ("ExportKey", ctypes.c_void_p),
        ("DestroyKey", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct BCRYPT_INTERFACE_VERSION {
    pub MajorVersion: u16,
    pub MinorVersion: u16,
}

#[repr(C)]
pub struct BCRYPT_SIGNATURE_FUNCTION_TABLE {
    pub Version: BCRYPT_INTERFACE_VERSION,
    pub OpenAlgorithmProvider: *mut core::ffi::c_void,
    pub GetProperty: *mut core::ffi::c_void,
    pub SetProperty: *mut core::ffi::c_void,
    pub CloseAlgorithmProvider: *mut core::ffi::c_void,
    pub GenerateKeyPair: *mut core::ffi::c_void,
    pub FinalizeKeyPair: *mut core::ffi::c_void,
    pub SignHash: *mut core::ffi::c_void,
    pub VerifySignature: *mut core::ffi::c_void,
    pub ImportKeyPair: *mut core::ffi::c_void,
    pub ExportKey: *mut core::ffi::c_void,
    pub DestroyKey: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type BCRYPT_INTERFACE_VERSION struct {
	MajorVersion uint16
	MinorVersion uint16
}

type BCRYPT_SIGNATURE_FUNCTION_TABLE struct {
	Version BCRYPT_INTERFACE_VERSION
	OpenAlgorithmProvider uintptr
	GetProperty uintptr
	SetProperty uintptr
	CloseAlgorithmProvider uintptr
	GenerateKeyPair uintptr
	FinalizeKeyPair uintptr
	SignHash uintptr
	VerifySignature uintptr
	ImportKeyPair uintptr
	ExportKey uintptr
	DestroyKey uintptr
}
type
  BCRYPT_INTERFACE_VERSION = record
    MajorVersion: Word;
    MinorVersion: Word;
  end;

  BCRYPT_SIGNATURE_FUNCTION_TABLE = record
    Version: BCRYPT_INTERFACE_VERSION;
    OpenAlgorithmProvider: Pointer;
    GetProperty: Pointer;
    SetProperty: Pointer;
    CloseAlgorithmProvider: Pointer;
    GenerateKeyPair: Pointer;
    FinalizeKeyPair: Pointer;
    SignHash: Pointer;
    VerifySignature: Pointer;
    ImportKeyPair: Pointer;
    ExportKey: Pointer;
    DestroyKey: Pointer;
  end;
const BCRYPT_INTERFACE_VERSION = extern struct {
    MajorVersion: u16,
    MinorVersion: u16,
};

const BCRYPT_SIGNATURE_FUNCTION_TABLE = extern struct {
    Version: BCRYPT_INTERFACE_VERSION,
    OpenAlgorithmProvider: ?*anyopaque,
    GetProperty: ?*anyopaque,
    SetProperty: ?*anyopaque,
    CloseAlgorithmProvider: ?*anyopaque,
    GenerateKeyPair: ?*anyopaque,
    FinalizeKeyPair: ?*anyopaque,
    SignHash: ?*anyopaque,
    VerifySignature: ?*anyopaque,
    ImportKeyPair: ?*anyopaque,
    ExportKey: ?*anyopaque,
    DestroyKey: ?*anyopaque,
};
type
  BCRYPT_INTERFACE_VERSION {.bycopy.} = object
    MajorVersion: uint16
    MinorVersion: uint16

  BCRYPT_SIGNATURE_FUNCTION_TABLE {.bycopy.} = object
    Version: BCRYPT_INTERFACE_VERSION
    OpenAlgorithmProvider: pointer
    GetProperty: pointer
    SetProperty: pointer
    CloseAlgorithmProvider: pointer
    GenerateKeyPair: pointer
    FinalizeKeyPair: pointer
    SignHash: pointer
    VerifySignature: pointer
    ImportKeyPair: pointer
    ExportKey: pointer
    DestroyKey: pointer
struct BCRYPT_INTERFACE_VERSION
{
    ushort MajorVersion;
    ushort MinorVersion;
}

struct BCRYPT_SIGNATURE_FUNCTION_TABLE
{
    BCRYPT_INTERFACE_VERSION Version;
    void* OpenAlgorithmProvider;
    void* GetProperty;
    void* SetProperty;
    void* CloseAlgorithmProvider;
    void* GenerateKeyPair;
    void* FinalizeKeyPair;
    void* SignHash;
    void* VerifySignature;
    void* ImportKeyPair;
    void* ExportKey;
    void* DestroyKey;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; BCRYPT_SIGNATURE_FUNCTION_TABLE サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Version : BCRYPT_INTERFACE_VERSION (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; OpenAlgorithmProvider : BCryptOpenAlgorithmProviderFn (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; GetProperty : BCryptGetPropertyFn (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; SetProperty : BCryptSetPropertyFn (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; CloseAlgorithmProvider : BCryptCloseAlgorithmProviderFn (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; GenerateKeyPair : BCryptGenerateKeyPairFn (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; FinalizeKeyPair : BCryptFinalizeKeyPairFn (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; SignHash : BCryptSignHashFn (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; VerifySignature : BCryptVerifySignatureFn (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ImportKeyPair : BCryptImportKeyPairFn (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ExportKey : BCryptExportKeyFn (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; DestroyKey : BCryptDestroyKeyFn (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; BCRYPT_SIGNATURE_FUNCTION_TABLE サイズ: 96 バイト(x64)
dim st, 24    ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; Version : BCRYPT_INTERFACE_VERSION (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; OpenAlgorithmProvider : BCryptOpenAlgorithmProviderFn (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; GetProperty : BCryptGetPropertyFn (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; SetProperty : BCryptSetPropertyFn (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; CloseAlgorithmProvider : BCryptCloseAlgorithmProviderFn (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; GenerateKeyPair : BCryptGenerateKeyPairFn (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; FinalizeKeyPair : BCryptFinalizeKeyPairFn (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; SignHash : BCryptSignHashFn (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; VerifySignature : BCryptVerifySignatureFn (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; ImportKeyPair : BCryptImportKeyPairFn (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; ExportKey : BCryptExportKeyFn (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; DestroyKey : BCryptDestroyKeyFn (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global BCRYPT_INTERFACE_VERSION
    #field short MajorVersion
    #field short MinorVersion
#endstruct

#defstruct global BCRYPT_SIGNATURE_FUNCTION_TABLE
    #field BCRYPT_INTERFACE_VERSION Version
    #field intptr OpenAlgorithmProvider
    #field intptr GetProperty
    #field intptr SetProperty
    #field intptr CloseAlgorithmProvider
    #field intptr GenerateKeyPair
    #field intptr FinalizeKeyPair
    #field intptr SignHash
    #field intptr VerifySignature
    #field intptr ImportKeyPair
    #field intptr ExportKey
    #field intptr DestroyKey
#endstruct

stdim st, BCRYPT_SIGNATURE_FUNCTION_TABLE        ; NSTRUCT 変数を確保