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+4KeyName 要素の値を格納する、null で終わるワイド文字列へのポインターです。
SKICRYPT_INTEGER_BLOB16/8+16+8X509SKI 要素の値を格納する CERT_BLOB 構造体です。
wszSubjectNameLPWSTR8/4+32+16X509SubjectName 要素の値を格納する、null で終わるワイド文字列へのポインターです。
cCertificateDWORD4+40+20rgCertificate メンバーが指す配列の要素数です。
rgCertificateCRYPT_INTEGER_BLOB*8/4+48+24X509Certificate 要素の値を設定するために使用される CERT_BLOB 構造体の配列へのポインターです。
cCRLDWORD4+56+28rgCRL メンバーが指す配列の要素数です。
rgCRLCRYPT_INTEGER_BLOB*8/4+64+32X509CRL 要素の値を設定するために使用される CERT_BLOB 構造体の配列へのポインターです。

公式ドキュメント

CRYPT_XML_KEYINFO_PARAM 構造体は、CryptXmlSign 関数が、エンコードする KeyInfo 要素のメンバーを指定するために使用します。

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

各言語での定義

#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