ホーム › Security.Cryptography › BCRYPT_HASH_FUNCTION_TABLE
BCRYPT_HASH_FUNCTION_TABLE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Version | BCRYPT_INTERFACE_VERSION | 4 | +0 | +0 | CNGハッシュインターフェイスのバージョン。 |
| OpenAlgorithmProvider | BCryptOpenAlgorithmProviderFn | 8/4 | +8 | +4 | アルゴリズムプロバイダーを開く関数ポインタ。 |
| GetProperty | BCryptGetPropertyFn | 8/4 | +16 | +8 | プロパティを取得する関数ポインタ。 |
| SetProperty | BCryptSetPropertyFn | 8/4 | +24 | +12 | プロパティを設定する関数ポインタ。 |
| CloseAlgorithmProvider | BCryptCloseAlgorithmProviderFn | 8/4 | +32 | +16 | アルゴリズムプロバイダーを閉じる関数ポインタ。 |
| CreateHash | BCryptCreateHashFn | 8/4 | +40 | +20 | ハッシュオブジェクトを生成する関数ポインタ。 |
| HashData | BCryptHashDataFn | 8/4 | +48 | +24 | データをハッシュに投入する関数ポインタ。 |
| FinishHash | BCryptFinishHashFn | 8/4 | +56 | +28 | ハッシュ値を確定する関数ポインタ。 |
| DuplicateHash | BCryptDuplicateHashFn | 8/4 | +64 | +32 | ハッシュオブジェクトを複製する関数ポインタ。 |
| DestroyHash | BCryptDestroyHashFn | 8/4 | +72 | +36 | ハッシュオブジェクトを破棄する関数ポインタ。 |
| CreateMultiHash | BCryptCreateMultiHashFn | 8/4 | +80 | +40 | マルチハッシュオブジェクトを生成する関数ポインタ。 |
| ProcessMultiOperations | BCryptProcessMultiOperationsFn | 8/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_HASH_FUNCTION_TABLE (x64 96 / x86 48 バイト)
typedef struct BCRYPT_HASH_FUNCTION_TABLE {
BCRYPT_INTERFACE_VERSION Version;
BCryptOpenAlgorithmProviderFn OpenAlgorithmProvider;
BCryptGetPropertyFn GetProperty;
BCryptSetPropertyFn SetProperty;
BCryptCloseAlgorithmProviderFn CloseAlgorithmProvider;
BCryptCreateHashFn CreateHash;
BCryptHashDataFn HashData;
BCryptFinishHashFn FinishHash;
BCryptDuplicateHashFn DuplicateHash;
BCryptDestroyHashFn DestroyHash;
BCryptCreateMultiHashFn CreateMultiHash;
BCryptProcessMultiOperationsFn ProcessMultiOperations;
} BCRYPT_HASH_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_HASH_FUNCTION_TABLE
{
public BCRYPT_INTERFACE_VERSION Version;
public IntPtr OpenAlgorithmProvider;
public IntPtr GetProperty;
public IntPtr SetProperty;
public IntPtr CloseAlgorithmProvider;
public IntPtr CreateHash;
public IntPtr HashData;
public IntPtr FinishHash;
public IntPtr DuplicateHash;
public IntPtr DestroyHash;
public IntPtr CreateMultiHash;
public IntPtr ProcessMultiOperations;
}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_HASH_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 CreateHash As IntPtr
Public HashData As IntPtr
Public FinishHash As IntPtr
Public DuplicateHash As IntPtr
Public DestroyHash As IntPtr
Public CreateMultiHash As IntPtr
Public ProcessMultiOperations As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class BCRYPT_INTERFACE_VERSION(ctypes.Structure):
_fields_ = [
("MajorVersion", ctypes.c_ushort),
("MinorVersion", ctypes.c_ushort),
]
class BCRYPT_HASH_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),
("CreateHash", ctypes.c_void_p),
("HashData", ctypes.c_void_p),
("FinishHash", ctypes.c_void_p),
("DuplicateHash", ctypes.c_void_p),
("DestroyHash", ctypes.c_void_p),
("CreateMultiHash", ctypes.c_void_p),
("ProcessMultiOperations", ctypes.c_void_p),
]#[repr(C)]
pub struct BCRYPT_INTERFACE_VERSION {
pub MajorVersion: u16,
pub MinorVersion: u16,
}
#[repr(C)]
pub struct BCRYPT_HASH_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 CreateHash: *mut core::ffi::c_void,
pub HashData: *mut core::ffi::c_void,
pub FinishHash: *mut core::ffi::c_void,
pub DuplicateHash: *mut core::ffi::c_void,
pub DestroyHash: *mut core::ffi::c_void,
pub CreateMultiHash: *mut core::ffi::c_void,
pub ProcessMultiOperations: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type BCRYPT_INTERFACE_VERSION struct {
MajorVersion uint16
MinorVersion uint16
}
type BCRYPT_HASH_FUNCTION_TABLE struct {
Version BCRYPT_INTERFACE_VERSION
OpenAlgorithmProvider uintptr
GetProperty uintptr
SetProperty uintptr
CloseAlgorithmProvider uintptr
CreateHash uintptr
HashData uintptr
FinishHash uintptr
DuplicateHash uintptr
DestroyHash uintptr
CreateMultiHash uintptr
ProcessMultiOperations uintptr
}type
BCRYPT_INTERFACE_VERSION = record
MajorVersion: Word;
MinorVersion: Word;
end;
BCRYPT_HASH_FUNCTION_TABLE = record
Version: BCRYPT_INTERFACE_VERSION;
OpenAlgorithmProvider: Pointer;
GetProperty: Pointer;
SetProperty: Pointer;
CloseAlgorithmProvider: Pointer;
CreateHash: Pointer;
HashData: Pointer;
FinishHash: Pointer;
DuplicateHash: Pointer;
DestroyHash: Pointer;
CreateMultiHash: Pointer;
ProcessMultiOperations: Pointer;
end;const BCRYPT_INTERFACE_VERSION = extern struct {
MajorVersion: u16,
MinorVersion: u16,
};
const BCRYPT_HASH_FUNCTION_TABLE = extern struct {
Version: BCRYPT_INTERFACE_VERSION,
OpenAlgorithmProvider: ?*anyopaque,
GetProperty: ?*anyopaque,
SetProperty: ?*anyopaque,
CloseAlgorithmProvider: ?*anyopaque,
CreateHash: ?*anyopaque,
HashData: ?*anyopaque,
FinishHash: ?*anyopaque,
DuplicateHash: ?*anyopaque,
DestroyHash: ?*anyopaque,
CreateMultiHash: ?*anyopaque,
ProcessMultiOperations: ?*anyopaque,
};type
BCRYPT_INTERFACE_VERSION {.bycopy.} = object
MajorVersion: uint16
MinorVersion: uint16
BCRYPT_HASH_FUNCTION_TABLE {.bycopy.} = object
Version: BCRYPT_INTERFACE_VERSION
OpenAlgorithmProvider: pointer
GetProperty: pointer
SetProperty: pointer
CloseAlgorithmProvider: pointer
CreateHash: pointer
HashData: pointer
FinishHash: pointer
DuplicateHash: pointer
DestroyHash: pointer
CreateMultiHash: pointer
ProcessMultiOperations: pointerstruct BCRYPT_INTERFACE_VERSION
{
ushort MajorVersion;
ushort MinorVersion;
}
struct BCRYPT_HASH_FUNCTION_TABLE
{
BCRYPT_INTERFACE_VERSION Version;
void* OpenAlgorithmProvider;
void* GetProperty;
void* SetProperty;
void* CloseAlgorithmProvider;
void* CreateHash;
void* HashData;
void* FinishHash;
void* DuplicateHash;
void* DestroyHash;
void* CreateMultiHash;
void* ProcessMultiOperations;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; BCRYPT_HASH_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 も可)
; CreateHash : BCryptCreateHashFn (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; HashData : BCryptHashDataFn (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; FinishHash : BCryptFinishHashFn (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; DuplicateHash : BCryptDuplicateHashFn (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; DestroyHash : BCryptDestroyHashFn (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; CreateMultiHash : BCryptCreateMultiHashFn (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ProcessMultiOperations : BCryptProcessMultiOperationsFn (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; BCRYPT_HASH_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,上位
; CreateHash : BCryptCreateHashFn (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; HashData : BCryptHashDataFn (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; FinishHash : BCryptFinishHashFn (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; DuplicateHash : BCryptDuplicateHashFn (+64, 8byte) qpoke st,64,値 / qpeek(st,64) ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; DestroyHash : BCryptDestroyHashFn (+72, 8byte) qpoke st,72,値 / qpeek(st,72) ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; CreateMultiHash : BCryptCreateMultiHashFn (+80, 8byte) qpoke st,80,値 / qpeek(st,80) ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; ProcessMultiOperations : BCryptProcessMultiOperationsFn (+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_HASH_FUNCTION_TABLE
#field BCRYPT_INTERFACE_VERSION Version
#field intptr OpenAlgorithmProvider
#field intptr GetProperty
#field intptr SetProperty
#field intptr CloseAlgorithmProvider
#field intptr CreateHash
#field intptr HashData
#field intptr FinishHash
#field intptr DuplicateHash
#field intptr DestroyHash
#field intptr CreateMultiHash
#field intptr ProcessMultiOperations
#endstruct
stdim st, BCRYPT_HASH_FUNCTION_TABLE ; NSTRUCT 変数を確保