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

CRYPT_XML_KEYINFO_PARAM

構造体
サイズx64: 72 バイト / x86: 36 バイト

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

フィールド

フィールドサイズx64x86説明
wszIdLPWSTR8/4+0+0KeyInfo要素に設定するID属性のワイド文字列。NULL可。
wszKeyNameLPWSTR8/4+8+4鍵名(KeyName)を示すワイド文字列。NULL可。
SKICRYPT_INTEGER_BLOB16/8+16+8サブジェクトキー識別子(SKI)のBLOB。
wszSubjectNameLPWSTR8/4+32+16証明書のサブジェクト名を示すワイド文字列。NULL可。
cCertificateDWORD4+40+20rgCertificate配列の証明書数。
rgCertificateCRYPT_INTEGER_BLOB*8/4+48+24証明書BLOBの配列。
cCRLDWORD4+56+28rgCRL配列のCRL数。
rgCRLCRYPT_INTEGER_BLOB*8/4+64+32失効リスト(CRL)BLOBの配列。

各言語での定義

#include <windows.h>

// CRYPT_INTEGER_BLOB  (x64 16 / x86 8 バイト)
typedef struct CRYPT_INTEGER_BLOB {
    DWORD cbData;
    BYTE* pbData;
} CRYPT_INTEGER_BLOB;

// CRYPT_XML_KEYINFO_PARAM  (x64 72 / x86 36 バイト)
typedef struct CRYPT_XML_KEYINFO_PARAM {
    LPWSTR wszId;
    LPWSTR wszKeyName;
    CRYPT_INTEGER_BLOB SKI;
    LPWSTR wszSubjectName;
    DWORD cCertificate;
    CRYPT_INTEGER_BLOB* rgCertificate;
    DWORD cCRL;
    CRYPT_INTEGER_BLOB* rgCRL;
} CRYPT_XML_KEYINFO_PARAM;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_INTEGER_BLOB
{
    public uint cbData;
    public IntPtr pbData;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CRYPT_XML_KEYINFO_PARAM
{
    public IntPtr wszId;
    public IntPtr wszKeyName;
    public CRYPT_INTEGER_BLOB SKI;
    public IntPtr wszSubjectName;
    public uint cCertificate;
    public IntPtr rgCertificate;
    public uint cCRL;
    public IntPtr rgCRL;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_INTEGER_BLOB
    Public cbData As UInteger
    Public pbData As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CRYPT_XML_KEYINFO_PARAM
    Public wszId As IntPtr
    Public wszKeyName As IntPtr
    Public SKI As CRYPT_INTEGER_BLOB
    Public wszSubjectName As IntPtr
    Public cCertificate As UInteger
    Public rgCertificate As IntPtr
    Public cCRL As UInteger
    Public rgCRL As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class CRYPT_INTEGER_BLOB(ctypes.Structure):
    _fields_ = [
        ("cbData", wintypes.DWORD),
        ("pbData", ctypes.c_void_p),
    ]

class CRYPT_XML_KEYINFO_PARAM(ctypes.Structure):
    _fields_ = [
        ("wszId", ctypes.c_void_p),
        ("wszKeyName", ctypes.c_void_p),
        ("SKI", CRYPT_INTEGER_BLOB),
        ("wszSubjectName", ctypes.c_void_p),
        ("cCertificate", wintypes.DWORD),
        ("rgCertificate", ctypes.c_void_p),
        ("cCRL", wintypes.DWORD),
        ("rgCRL", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct CRYPT_INTEGER_BLOB {
    pub cbData: u32,
    pub pbData: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct CRYPT_XML_KEYINFO_PARAM {
    pub wszId: *mut core::ffi::c_void,
    pub wszKeyName: *mut core::ffi::c_void,
    pub SKI: CRYPT_INTEGER_BLOB,
    pub wszSubjectName: *mut core::ffi::c_void,
    pub cCertificate: u32,
    pub rgCertificate: *mut core::ffi::c_void,
    pub cCRL: u32,
    pub rgCRL: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type CRYPT_INTEGER_BLOB struct {
	cbData uint32
	pbData uintptr
}

type CRYPT_XML_KEYINFO_PARAM struct {
	wszId uintptr
	wszKeyName uintptr
	SKI CRYPT_INTEGER_BLOB
	wszSubjectName uintptr
	cCertificate uint32
	rgCertificate uintptr
	cCRL uint32
	rgCRL uintptr
}
type
  CRYPT_INTEGER_BLOB = record
    cbData: DWORD;
    pbData: Pointer;
  end;

  CRYPT_XML_KEYINFO_PARAM = record
    wszId: Pointer;
    wszKeyName: Pointer;
    SKI: CRYPT_INTEGER_BLOB;
    wszSubjectName: Pointer;
    cCertificate: DWORD;
    rgCertificate: Pointer;
    cCRL: DWORD;
    rgCRL: Pointer;
  end;
const CRYPT_INTEGER_BLOB = extern struct {
    cbData: u32,
    pbData: ?*anyopaque,
};

const CRYPT_XML_KEYINFO_PARAM = extern struct {
    wszId: ?*anyopaque,
    wszKeyName: ?*anyopaque,
    SKI: CRYPT_INTEGER_BLOB,
    wszSubjectName: ?*anyopaque,
    cCertificate: u32,
    rgCertificate: ?*anyopaque,
    cCRL: u32,
    rgCRL: ?*anyopaque,
};
type
  CRYPT_INTEGER_BLOB {.bycopy.} = object
    cbData: uint32
    pbData: pointer

  CRYPT_XML_KEYINFO_PARAM {.bycopy.} = object
    wszId: pointer
    wszKeyName: pointer
    SKI: CRYPT_INTEGER_BLOB
    wszSubjectName: pointer
    cCertificate: uint32
    rgCertificate: pointer
    cCRL: uint32
    rgCRL: pointer
struct CRYPT_INTEGER_BLOB
{
    uint cbData;
    void* pbData;
}

struct CRYPT_XML_KEYINFO_PARAM
{
    void* wszId;
    void* wszKeyName;
    CRYPT_INTEGER_BLOB SKI;
    void* wszSubjectName;
    uint cCertificate;
    void* rgCertificate;
    uint cCRL;
    void* rgCRL;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CRYPT_XML_KEYINFO_PARAM サイズ: 36 バイト(x86)
dim st, 9    ; 4byte整数×9(構造体サイズ 36 / 4 切り上げ)
; wszId : LPWSTR (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; wszKeyName : LPWSTR (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SKI : CRYPT_INTEGER_BLOB (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; wszSubjectName : LPWSTR (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; cCertificate : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; rgCertificate : CRYPT_INTEGER_BLOB* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; cCRL : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; rgCRL : CRYPT_INTEGER_BLOB* (+32, 4byte)  varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CRYPT_XML_KEYINFO_PARAM サイズ: 72 バイト(x64)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; wszId : LPWSTR (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; wszKeyName : LPWSTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; SKI : CRYPT_INTEGER_BLOB (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; wszSubjectName : LPWSTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; cCertificate : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; rgCertificate : CRYPT_INTEGER_BLOB* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; cCRL : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; rgCRL : CRYPT_INTEGER_BLOB* (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global CRYPT_INTEGER_BLOB
    #field int cbData
    #field intptr pbData
#endstruct

#defstruct global CRYPT_XML_KEYINFO_PARAM
    #field intptr wszId
    #field intptr wszKeyName
    #field CRYPT_INTEGER_BLOB SKI
    #field intptr wszSubjectName
    #field int cCertificate
    #field intptr rgCertificate
    #field int cCRL
    #field intptr rgCRL
#endstruct

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