Win32 API 日本語リファレンス
ホームSecurity.Authentication.WebAuthn › EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST

EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST

構造体
サイズx64: 176 バイト / x86: 104 バイト

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

フィールド

フィールドサイズx64x86説明
dwVersionDWORD4+0+0この構造体のバージョン番号を示す。
pwszRpIdLPWSTR8/4+8+4信頼当事者(RP)IDの文字列へのポインタ。
cbRpIdDWORD4+16+8RP IDのバイト数を示す。
pbRpIdBYTE*8/4+24+12RP IDのバイト列へのポインタ。
cbClientDataHashDWORD4+32+16クライアントデータハッシュのバイト数を示す。
pbClientDataHashBYTE*8/4+40+20クライアントデータのハッシュへのポインタ。
CredentialListWEBAUTHN_CREDENTIAL_LIST16/8+48+24許可する資格情報の一覧を保持する。
cbCborExtensionsMapDWORD4+64+32CBOR拡張マップのバイト数を示す。
pbCborExtensionsMapBYTE*8/4+72+36CBORエンコードされた拡張マップへのポインタ。
pAuthenticatorOptionsEXPERIMENTAL_WEBAUTHN_CTAPCBOR_AUTHENTICATOR_OPTIONS*8/4+80+40認証器オプションへのポインタ。
fEmptyPinAuthBOOL4+88+44空のpinAuthを使用するかを示すブール値。
cbPinAuthDWORD4+92+48pinAuthのバイト数を示す。
pbPinAuthBYTE*8/4+96+52PINプロトコルのpinAuth値へのポインタ。
pHmacSaltExtensionEXPERIMENTAL_WEBAUTHN_CTAPCBOR_HMAC_SALT_EXTENSION*8/4+104+56hmac-secretソルト拡張へのポインタ。NULL可。
cbHmacSecretSaltValuesDWORD4+112+60hmac-secretソルト値のバイト数を示す。
pbHmacSecretSaltValuesBYTE*8/4+120+64hmac-secretソルト値データへのポインタ。
dwPinProtocolDWORD4+128+68使用するPINプロトコルのバージョンを示す。
lCredBlobExtINT4+132+72credBlob拡張の指定値を示す。
lLargeBlobKeyExtINT4+136+76largeBlobKey拡張の指定値を示す。
dwCredLargeBlobOperationDWORD4+140+80large blobに対する操作種別を示す。
cbCredLargeBlobCompressedDWORD4+144+84圧縮済みlarge blobのバイト数を示す。
pbCredLargeBlobCompressedBYTE*8/4+152+88圧縮されたlarge blobデータへのポインタ。
dwCredLargeBlobOriginalSizeDWORD4+160+92large blobの圧縮前サイズを示す。
cbJsonExtDWORD4+164+96JSON形式拡張データのバイト数を示す。
pbJsonExtBYTE*8/4+168+100JSON形式の拡張データへのポインタ。

各言語での定義

#include <windows.h>

// WEBAUTHN_CREDENTIAL_LIST  (x64 16 / x86 8 バイト)
typedef struct WEBAUTHN_CREDENTIAL_LIST {
    DWORD cCredentials;
    WEBAUTHN_CREDENTIAL_EX** ppCredentials;
} WEBAUTHN_CREDENTIAL_LIST;

// EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST  (x64 176 / x86 104 バイト)
typedef struct EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST {
    DWORD dwVersion;
    LPWSTR pwszRpId;
    DWORD cbRpId;
    BYTE* pbRpId;
    DWORD cbClientDataHash;
    BYTE* pbClientDataHash;
    WEBAUTHN_CREDENTIAL_LIST CredentialList;
    DWORD cbCborExtensionsMap;
    BYTE* pbCborExtensionsMap;
    EXPERIMENTAL_WEBAUTHN_CTAPCBOR_AUTHENTICATOR_OPTIONS* pAuthenticatorOptions;
    BOOL fEmptyPinAuth;
    DWORD cbPinAuth;
    BYTE* pbPinAuth;
    EXPERIMENTAL_WEBAUTHN_CTAPCBOR_HMAC_SALT_EXTENSION* pHmacSaltExtension;
    DWORD cbHmacSecretSaltValues;
    BYTE* pbHmacSecretSaltValues;
    DWORD dwPinProtocol;
    INT lCredBlobExt;
    INT lLargeBlobKeyExt;
    DWORD dwCredLargeBlobOperation;
    DWORD cbCredLargeBlobCompressed;
    BYTE* pbCredLargeBlobCompressed;
    DWORD dwCredLargeBlobOriginalSize;
    DWORD cbJsonExt;
    BYTE* pbJsonExt;
} EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WEBAUTHN_CREDENTIAL_LIST
{
    public uint cCredentials;
    public IntPtr ppCredentials;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST
{
    public uint dwVersion;
    public IntPtr pwszRpId;
    public uint cbRpId;
    public IntPtr pbRpId;
    public uint cbClientDataHash;
    public IntPtr pbClientDataHash;
    public WEBAUTHN_CREDENTIAL_LIST CredentialList;
    public uint cbCborExtensionsMap;
    public IntPtr pbCborExtensionsMap;
    public IntPtr pAuthenticatorOptions;
    [MarshalAs(UnmanagedType.Bool)] public bool fEmptyPinAuth;
    public uint cbPinAuth;
    public IntPtr pbPinAuth;
    public IntPtr pHmacSaltExtension;
    public uint cbHmacSecretSaltValues;
    public IntPtr pbHmacSecretSaltValues;
    public uint dwPinProtocol;
    public int lCredBlobExt;
    public int lLargeBlobKeyExt;
    public uint dwCredLargeBlobOperation;
    public uint cbCredLargeBlobCompressed;
    public IntPtr pbCredLargeBlobCompressed;
    public uint dwCredLargeBlobOriginalSize;
    public uint cbJsonExt;
    public IntPtr pbJsonExt;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WEBAUTHN_CREDENTIAL_LIST
    Public cCredentials As UInteger
    Public ppCredentials As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST
    Public dwVersion As UInteger
    Public pwszRpId As IntPtr
    Public cbRpId As UInteger
    Public pbRpId As IntPtr
    Public cbClientDataHash As UInteger
    Public pbClientDataHash As IntPtr
    Public CredentialList As WEBAUTHN_CREDENTIAL_LIST
    Public cbCborExtensionsMap As UInteger
    Public pbCborExtensionsMap As IntPtr
    Public pAuthenticatorOptions As IntPtr
    <MarshalAs(UnmanagedType.Bool)> Public fEmptyPinAuth As Boolean
    Public cbPinAuth As UInteger
    Public pbPinAuth As IntPtr
    Public pHmacSaltExtension As IntPtr
    Public cbHmacSecretSaltValues As UInteger
    Public pbHmacSecretSaltValues As IntPtr
    Public dwPinProtocol As UInteger
    Public lCredBlobExt As Integer
    Public lLargeBlobKeyExt As Integer
    Public dwCredLargeBlobOperation As UInteger
    Public cbCredLargeBlobCompressed As UInteger
    Public pbCredLargeBlobCompressed As IntPtr
    Public dwCredLargeBlobOriginalSize As UInteger
    Public cbJsonExt As UInteger
    Public pbJsonExt As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class WEBAUTHN_CREDENTIAL_LIST(ctypes.Structure):
    _fields_ = [
        ("cCredentials", wintypes.DWORD),
        ("ppCredentials", ctypes.c_void_p),
    ]

class EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST(ctypes.Structure):
    _fields_ = [
        ("dwVersion", wintypes.DWORD),
        ("pwszRpId", ctypes.c_void_p),
        ("cbRpId", wintypes.DWORD),
        ("pbRpId", ctypes.c_void_p),
        ("cbClientDataHash", wintypes.DWORD),
        ("pbClientDataHash", ctypes.c_void_p),
        ("CredentialList", WEBAUTHN_CREDENTIAL_LIST),
        ("cbCborExtensionsMap", wintypes.DWORD),
        ("pbCborExtensionsMap", ctypes.c_void_p),
        ("pAuthenticatorOptions", ctypes.c_void_p),
        ("fEmptyPinAuth", wintypes.BOOL),
        ("cbPinAuth", wintypes.DWORD),
        ("pbPinAuth", ctypes.c_void_p),
        ("pHmacSaltExtension", ctypes.c_void_p),
        ("cbHmacSecretSaltValues", wintypes.DWORD),
        ("pbHmacSecretSaltValues", ctypes.c_void_p),
        ("dwPinProtocol", wintypes.DWORD),
        ("lCredBlobExt", ctypes.c_int),
        ("lLargeBlobKeyExt", ctypes.c_int),
        ("dwCredLargeBlobOperation", wintypes.DWORD),
        ("cbCredLargeBlobCompressed", wintypes.DWORD),
        ("pbCredLargeBlobCompressed", ctypes.c_void_p),
        ("dwCredLargeBlobOriginalSize", wintypes.DWORD),
        ("cbJsonExt", wintypes.DWORD),
        ("pbJsonExt", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WEBAUTHN_CREDENTIAL_LIST {
    pub cCredentials: u32,
    pub ppCredentials: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST {
    pub dwVersion: u32,
    pub pwszRpId: *mut core::ffi::c_void,
    pub cbRpId: u32,
    pub pbRpId: *mut core::ffi::c_void,
    pub cbClientDataHash: u32,
    pub pbClientDataHash: *mut core::ffi::c_void,
    pub CredentialList: WEBAUTHN_CREDENTIAL_LIST,
    pub cbCborExtensionsMap: u32,
    pub pbCborExtensionsMap: *mut core::ffi::c_void,
    pub pAuthenticatorOptions: *mut core::ffi::c_void,
    pub fEmptyPinAuth: i32,
    pub cbPinAuth: u32,
    pub pbPinAuth: *mut core::ffi::c_void,
    pub pHmacSaltExtension: *mut core::ffi::c_void,
    pub cbHmacSecretSaltValues: u32,
    pub pbHmacSecretSaltValues: *mut core::ffi::c_void,
    pub dwPinProtocol: u32,
    pub lCredBlobExt: i32,
    pub lLargeBlobKeyExt: i32,
    pub dwCredLargeBlobOperation: u32,
    pub cbCredLargeBlobCompressed: u32,
    pub pbCredLargeBlobCompressed: *mut core::ffi::c_void,
    pub dwCredLargeBlobOriginalSize: u32,
    pub cbJsonExt: u32,
    pub pbJsonExt: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WEBAUTHN_CREDENTIAL_LIST struct {
	cCredentials uint32
	ppCredentials uintptr
}

type EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST struct {
	dwVersion uint32
	pwszRpId uintptr
	cbRpId uint32
	pbRpId uintptr
	cbClientDataHash uint32
	pbClientDataHash uintptr
	CredentialList WEBAUTHN_CREDENTIAL_LIST
	cbCborExtensionsMap uint32
	pbCborExtensionsMap uintptr
	pAuthenticatorOptions uintptr
	fEmptyPinAuth int32
	cbPinAuth uint32
	pbPinAuth uintptr
	pHmacSaltExtension uintptr
	cbHmacSecretSaltValues uint32
	pbHmacSecretSaltValues uintptr
	dwPinProtocol uint32
	lCredBlobExt int32
	lLargeBlobKeyExt int32
	dwCredLargeBlobOperation uint32
	cbCredLargeBlobCompressed uint32
	pbCredLargeBlobCompressed uintptr
	dwCredLargeBlobOriginalSize uint32
	cbJsonExt uint32
	pbJsonExt uintptr
}
type
  WEBAUTHN_CREDENTIAL_LIST = record
    cCredentials: DWORD;
    ppCredentials: Pointer;
  end;

  EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST = record
    dwVersion: DWORD;
    pwszRpId: Pointer;
    cbRpId: DWORD;
    pbRpId: Pointer;
    cbClientDataHash: DWORD;
    pbClientDataHash: Pointer;
    CredentialList: WEBAUTHN_CREDENTIAL_LIST;
    cbCborExtensionsMap: DWORD;
    pbCborExtensionsMap: Pointer;
    pAuthenticatorOptions: Pointer;
    fEmptyPinAuth: BOOL;
    cbPinAuth: DWORD;
    pbPinAuth: Pointer;
    pHmacSaltExtension: Pointer;
    cbHmacSecretSaltValues: DWORD;
    pbHmacSecretSaltValues: Pointer;
    dwPinProtocol: DWORD;
    lCredBlobExt: Integer;
    lLargeBlobKeyExt: Integer;
    dwCredLargeBlobOperation: DWORD;
    cbCredLargeBlobCompressed: DWORD;
    pbCredLargeBlobCompressed: Pointer;
    dwCredLargeBlobOriginalSize: DWORD;
    cbJsonExt: DWORD;
    pbJsonExt: Pointer;
  end;
const WEBAUTHN_CREDENTIAL_LIST = extern struct {
    cCredentials: u32,
    ppCredentials: ?*anyopaque,
};

const EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST = extern struct {
    dwVersion: u32,
    pwszRpId: ?*anyopaque,
    cbRpId: u32,
    pbRpId: ?*anyopaque,
    cbClientDataHash: u32,
    pbClientDataHash: ?*anyopaque,
    CredentialList: WEBAUTHN_CREDENTIAL_LIST,
    cbCborExtensionsMap: u32,
    pbCborExtensionsMap: ?*anyopaque,
    pAuthenticatorOptions: ?*anyopaque,
    fEmptyPinAuth: i32,
    cbPinAuth: u32,
    pbPinAuth: ?*anyopaque,
    pHmacSaltExtension: ?*anyopaque,
    cbHmacSecretSaltValues: u32,
    pbHmacSecretSaltValues: ?*anyopaque,
    dwPinProtocol: u32,
    lCredBlobExt: i32,
    lLargeBlobKeyExt: i32,
    dwCredLargeBlobOperation: u32,
    cbCredLargeBlobCompressed: u32,
    pbCredLargeBlobCompressed: ?*anyopaque,
    dwCredLargeBlobOriginalSize: u32,
    cbJsonExt: u32,
    pbJsonExt: ?*anyopaque,
};
type
  WEBAUTHN_CREDENTIAL_LIST {.bycopy.} = object
    cCredentials: uint32
    ppCredentials: pointer

  EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST {.bycopy.} = object
    dwVersion: uint32
    pwszRpId: pointer
    cbRpId: uint32
    pbRpId: pointer
    cbClientDataHash: uint32
    pbClientDataHash: pointer
    CredentialList: WEBAUTHN_CREDENTIAL_LIST
    cbCborExtensionsMap: uint32
    pbCborExtensionsMap: pointer
    pAuthenticatorOptions: pointer
    fEmptyPinAuth: int32
    cbPinAuth: uint32
    pbPinAuth: pointer
    pHmacSaltExtension: pointer
    cbHmacSecretSaltValues: uint32
    pbHmacSecretSaltValues: pointer
    dwPinProtocol: uint32
    lCredBlobExt: int32
    lLargeBlobKeyExt: int32
    dwCredLargeBlobOperation: uint32
    cbCredLargeBlobCompressed: uint32
    pbCredLargeBlobCompressed: pointer
    dwCredLargeBlobOriginalSize: uint32
    cbJsonExt: uint32
    pbJsonExt: pointer
struct WEBAUTHN_CREDENTIAL_LIST
{
    uint cCredentials;
    void* ppCredentials;
}

struct EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST
{
    uint dwVersion;
    void* pwszRpId;
    uint cbRpId;
    void* pbRpId;
    uint cbClientDataHash;
    void* pbClientDataHash;
    WEBAUTHN_CREDENTIAL_LIST CredentialList;
    uint cbCborExtensionsMap;
    void* pbCborExtensionsMap;
    void* pAuthenticatorOptions;
    int fEmptyPinAuth;
    uint cbPinAuth;
    void* pbPinAuth;
    void* pHmacSaltExtension;
    uint cbHmacSecretSaltValues;
    void* pbHmacSecretSaltValues;
    uint dwPinProtocol;
    int lCredBlobExt;
    int lLargeBlobKeyExt;
    uint dwCredLargeBlobOperation;
    uint cbCredLargeBlobCompressed;
    void* pbCredLargeBlobCompressed;
    uint dwCredLargeBlobOriginalSize;
    uint cbJsonExt;
    void* pbJsonExt;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST サイズ: 104 バイト(x86)
dim st, 26    ; 4byte整数×26(構造体サイズ 104 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pwszRpId : LPWSTR (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; cbRpId : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; pbRpId : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; cbClientDataHash : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pbClientDataHash : BYTE* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; CredentialList : WEBAUTHN_CREDENTIAL_LIST (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; cbCborExtensionsMap : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pbCborExtensionsMap : BYTE* (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; pAuthenticatorOptions : EXPERIMENTAL_WEBAUTHN_CTAPCBOR_AUTHENTICATOR_OPTIONS* (+40, 4byte)  varptr(st)+40 を基点に操作(4byte:入れ子/配列)
; fEmptyPinAuth : BOOL (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; cbPinAuth : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; pbPinAuth : BYTE* (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; pHmacSaltExtension : EXPERIMENTAL_WEBAUTHN_CTAPCBOR_HMAC_SALT_EXTENSION* (+56, 4byte)  varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; cbHmacSecretSaltValues : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; pbHmacSecretSaltValues : BYTE* (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; dwPinProtocol : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; lCredBlobExt : INT (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; lLargeBlobKeyExt : INT (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; dwCredLargeBlobOperation : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; cbCredLargeBlobCompressed : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; pbCredLargeBlobCompressed : BYTE* (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; dwCredLargeBlobOriginalSize : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; cbJsonExt : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; pbJsonExt : BYTE* (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST サイズ: 176 バイト(x64)
dim st, 44    ; 4byte整数×44(構造体サイズ 176 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pwszRpId : LPWSTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; cbRpId : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pbRpId : BYTE* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; cbClientDataHash : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pbClientDataHash : BYTE* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; CredentialList : WEBAUTHN_CREDENTIAL_LIST (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; cbCborExtensionsMap : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; pbCborExtensionsMap : BYTE* (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; pAuthenticatorOptions : EXPERIMENTAL_WEBAUTHN_CTAPCBOR_AUTHENTICATOR_OPTIONS* (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; fEmptyPinAuth : BOOL (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; cbPinAuth : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; pbPinAuth : BYTE* (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; pHmacSaltExtension : EXPERIMENTAL_WEBAUTHN_CTAPCBOR_HMAC_SALT_EXTENSION* (+104, 8byte)  varptr(st)+104 を基点に操作(8byte:入れ子/配列)
; cbHmacSecretSaltValues : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; pbHmacSecretSaltValues : BYTE* (+120, 8byte)  qpoke st,120,値 / qpeek(st,120)  ※IronHSPのみ。3.7/3.8は lpoke st,120,下位 : lpoke st,124,上位
; dwPinProtocol : DWORD (+128, 4byte)  st.32 = 値  /  値 = st.32   (lpoke/lpeek も可)
; lCredBlobExt : INT (+132, 4byte)  st.33 = 値  /  値 = st.33   (lpoke/lpeek も可)
; lLargeBlobKeyExt : INT (+136, 4byte)  st.34 = 値  /  値 = st.34   (lpoke/lpeek も可)
; dwCredLargeBlobOperation : DWORD (+140, 4byte)  st.35 = 値  /  値 = st.35   (lpoke/lpeek も可)
; cbCredLargeBlobCompressed : DWORD (+144, 4byte)  st.36 = 値  /  値 = st.36   (lpoke/lpeek も可)
; pbCredLargeBlobCompressed : BYTE* (+152, 8byte)  qpoke st,152,値 / qpeek(st,152)  ※IronHSPのみ。3.7/3.8は lpoke st,152,下位 : lpoke st,156,上位
; dwCredLargeBlobOriginalSize : DWORD (+160, 4byte)  st.40 = 値  /  値 = st.40   (lpoke/lpeek も可)
; cbJsonExt : DWORD (+164, 4byte)  st.41 = 値  /  値 = st.41   (lpoke/lpeek も可)
; pbJsonExt : BYTE* (+168, 8byte)  qpoke st,168,値 / qpeek(st,168)  ※IronHSPのみ。3.7/3.8は lpoke st,168,下位 : lpoke st,172,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WEBAUTHN_CREDENTIAL_LIST
    #field int cCredentials
    #field intptr ppCredentials
#endstruct

#defstruct global EXPERIMENTAL_WEBAUTHN_CTAPCBOR_GET_ASSERTION_REQUEST
    #field int dwVersion
    #field intptr pwszRpId
    #field int cbRpId
    #field intptr pbRpId
    #field int cbClientDataHash
    #field intptr pbClientDataHash
    #field WEBAUTHN_CREDENTIAL_LIST CredentialList
    #field int cbCborExtensionsMap
    #field intptr pbCborExtensionsMap
    #field intptr pAuthenticatorOptions
    #field bool fEmptyPinAuth
    #field int cbPinAuth
    #field intptr pbPinAuth
    #field intptr pHmacSaltExtension
    #field int cbHmacSecretSaltValues
    #field intptr pbHmacSecretSaltValues
    #field int dwPinProtocol
    #field int lCredBlobExt
    #field int lLargeBlobKeyExt
    #field int dwCredLargeBlobOperation
    #field int cbCredLargeBlobCompressed
    #field intptr pbCredLargeBlobCompressed
    #field int dwCredLargeBlobOriginalSize
    #field int cbJsonExt
    #field intptr pbJsonExt
#endstruct

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