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

WEBAUTHN_ASSERTION

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

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

フィールド

フィールドサイズx64x86説明
dwVersionDWORD4+0+0この構造体のバージョン番号を示す。
cbAuthenticatorDataDWORD4+4+4認証器データのバイト数を示す。
pbAuthenticatorDataBYTE*8/4+8+8認証器データ(authenticatorData)へのポインタ。
cbSignatureDWORD4+16+12署名データのバイト数を示す。
pbSignatureBYTE*8/4+24+16アサーション署名データへのポインタ。
CredentialWEBAUTHN_CREDENTIAL24/16+32+20アサーションに使用された資格情報を保持する。
cbUserIdDWORD4+56+36ユーザーIDのバイト数を示す。
pbUserIdBYTE*8/4+64+40ユーザーハンドル(ユーザーID)へのポインタ。NULL可。
ExtensionsWEBAUTHN_EXTENSIONS16/8+72+44アサーションに含まれるWebAuthn拡張の集合を保持する。
cbCredLargeBlobDWORD4+88+52large blobデータのバイト数を示す。
pbCredLargeBlobBYTE*8/4+96+56取得したlarge blobデータへのポインタ。
dwCredLargeBlobStatusDWORD4+104+60large blob操作の結果状態を示す値。
pHmacSecretWEBAUTHN_HMAC_SECRET_SALT*8/4+112+64hmac-secret拡張の結果ソルトへのポインタ。NULL可。
dwUsedTransportDWORD4+120+68使用された認証器トランスポートを示すビット値。
cbUnsignedExtensionOutputsDWORD4+124+72署名対象外拡張出力のバイト数を示す。
pbUnsignedExtensionOutputsBYTE*8/4+128+76署名対象外の拡張出力データへのポインタ。
cbClientDataJSONDWORD4+136+80クライアントデータJSONのバイト数を示す。
pbClientDataJSONBYTE*8/4+144+84クライアントデータJSONへのポインタ。
cbAuthenticationResponseJSONDWORD4+152+88認証応答JSONのバイト数を示す。
pbAuthenticationResponseJSONBYTE*8/4+160+92認証応答JSONデータへのポインタ。

各言語での定義

#include <windows.h>

// WEBAUTHN_CREDENTIAL  (x64 24 / x86 16 バイト)
typedef struct WEBAUTHN_CREDENTIAL {
    DWORD dwVersion;
    DWORD cbId;
    BYTE* pbId;
    LPWSTR pwszCredentialType;
} WEBAUTHN_CREDENTIAL;

// WEBAUTHN_EXTENSIONS  (x64 16 / x86 8 バイト)
typedef struct WEBAUTHN_EXTENSIONS {
    DWORD cExtensions;
    WEBAUTHN_EXTENSION* pExtensions;
} WEBAUTHN_EXTENSIONS;

// WEBAUTHN_ASSERTION  (x64 168 / x86 96 バイト)
typedef struct WEBAUTHN_ASSERTION {
    DWORD dwVersion;
    DWORD cbAuthenticatorData;
    BYTE* pbAuthenticatorData;
    DWORD cbSignature;
    BYTE* pbSignature;
    WEBAUTHN_CREDENTIAL Credential;
    DWORD cbUserId;
    BYTE* pbUserId;
    WEBAUTHN_EXTENSIONS Extensions;
    DWORD cbCredLargeBlob;
    BYTE* pbCredLargeBlob;
    DWORD dwCredLargeBlobStatus;
    WEBAUTHN_HMAC_SECRET_SALT* pHmacSecret;
    DWORD dwUsedTransport;
    DWORD cbUnsignedExtensionOutputs;
    BYTE* pbUnsignedExtensionOutputs;
    DWORD cbClientDataJSON;
    BYTE* pbClientDataJSON;
    DWORD cbAuthenticationResponseJSON;
    BYTE* pbAuthenticationResponseJSON;
} WEBAUTHN_ASSERTION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WEBAUTHN_CREDENTIAL
{
    public uint dwVersion;
    public uint cbId;
    public IntPtr pbId;
    public IntPtr pwszCredentialType;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WEBAUTHN_EXTENSIONS
{
    public uint cExtensions;
    public IntPtr pExtensions;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WEBAUTHN_ASSERTION
{
    public uint dwVersion;
    public uint cbAuthenticatorData;
    public IntPtr pbAuthenticatorData;
    public uint cbSignature;
    public IntPtr pbSignature;
    public WEBAUTHN_CREDENTIAL Credential;
    public uint cbUserId;
    public IntPtr pbUserId;
    public WEBAUTHN_EXTENSIONS Extensions;
    public uint cbCredLargeBlob;
    public IntPtr pbCredLargeBlob;
    public uint dwCredLargeBlobStatus;
    public IntPtr pHmacSecret;
    public uint dwUsedTransport;
    public uint cbUnsignedExtensionOutputs;
    public IntPtr pbUnsignedExtensionOutputs;
    public uint cbClientDataJSON;
    public IntPtr pbClientDataJSON;
    public uint cbAuthenticationResponseJSON;
    public IntPtr pbAuthenticationResponseJSON;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WEBAUTHN_CREDENTIAL
    Public dwVersion As UInteger
    Public cbId As UInteger
    Public pbId As IntPtr
    Public pwszCredentialType As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WEBAUTHN_EXTENSIONS
    Public cExtensions As UInteger
    Public pExtensions As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WEBAUTHN_ASSERTION
    Public dwVersion As UInteger
    Public cbAuthenticatorData As UInteger
    Public pbAuthenticatorData As IntPtr
    Public cbSignature As UInteger
    Public pbSignature As IntPtr
    Public Credential As WEBAUTHN_CREDENTIAL
    Public cbUserId As UInteger
    Public pbUserId As IntPtr
    Public Extensions As WEBAUTHN_EXTENSIONS
    Public cbCredLargeBlob As UInteger
    Public pbCredLargeBlob As IntPtr
    Public dwCredLargeBlobStatus As UInteger
    Public pHmacSecret As IntPtr
    Public dwUsedTransport As UInteger
    Public cbUnsignedExtensionOutputs As UInteger
    Public pbUnsignedExtensionOutputs As IntPtr
    Public cbClientDataJSON As UInteger
    Public pbClientDataJSON As IntPtr
    Public cbAuthenticationResponseJSON As UInteger
    Public pbAuthenticationResponseJSON As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class WEBAUTHN_CREDENTIAL(ctypes.Structure):
    _fields_ = [
        ("dwVersion", wintypes.DWORD),
        ("cbId", wintypes.DWORD),
        ("pbId", ctypes.c_void_p),
        ("pwszCredentialType", ctypes.c_void_p),
    ]

class WEBAUTHN_EXTENSIONS(ctypes.Structure):
    _fields_ = [
        ("cExtensions", wintypes.DWORD),
        ("pExtensions", ctypes.c_void_p),
    ]

class WEBAUTHN_ASSERTION(ctypes.Structure):
    _fields_ = [
        ("dwVersion", wintypes.DWORD),
        ("cbAuthenticatorData", wintypes.DWORD),
        ("pbAuthenticatorData", ctypes.c_void_p),
        ("cbSignature", wintypes.DWORD),
        ("pbSignature", ctypes.c_void_p),
        ("Credential", WEBAUTHN_CREDENTIAL),
        ("cbUserId", wintypes.DWORD),
        ("pbUserId", ctypes.c_void_p),
        ("Extensions", WEBAUTHN_EXTENSIONS),
        ("cbCredLargeBlob", wintypes.DWORD),
        ("pbCredLargeBlob", ctypes.c_void_p),
        ("dwCredLargeBlobStatus", wintypes.DWORD),
        ("pHmacSecret", ctypes.c_void_p),
        ("dwUsedTransport", wintypes.DWORD),
        ("cbUnsignedExtensionOutputs", wintypes.DWORD),
        ("pbUnsignedExtensionOutputs", ctypes.c_void_p),
        ("cbClientDataJSON", wintypes.DWORD),
        ("pbClientDataJSON", ctypes.c_void_p),
        ("cbAuthenticationResponseJSON", wintypes.DWORD),
        ("pbAuthenticationResponseJSON", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WEBAUTHN_CREDENTIAL {
    pub dwVersion: u32,
    pub cbId: u32,
    pub pbId: *mut core::ffi::c_void,
    pub pwszCredentialType: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct WEBAUTHN_EXTENSIONS {
    pub cExtensions: u32,
    pub pExtensions: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct WEBAUTHN_ASSERTION {
    pub dwVersion: u32,
    pub cbAuthenticatorData: u32,
    pub pbAuthenticatorData: *mut core::ffi::c_void,
    pub cbSignature: u32,
    pub pbSignature: *mut core::ffi::c_void,
    pub Credential: WEBAUTHN_CREDENTIAL,
    pub cbUserId: u32,
    pub pbUserId: *mut core::ffi::c_void,
    pub Extensions: WEBAUTHN_EXTENSIONS,
    pub cbCredLargeBlob: u32,
    pub pbCredLargeBlob: *mut core::ffi::c_void,
    pub dwCredLargeBlobStatus: u32,
    pub pHmacSecret: *mut core::ffi::c_void,
    pub dwUsedTransport: u32,
    pub cbUnsignedExtensionOutputs: u32,
    pub pbUnsignedExtensionOutputs: *mut core::ffi::c_void,
    pub cbClientDataJSON: u32,
    pub pbClientDataJSON: *mut core::ffi::c_void,
    pub cbAuthenticationResponseJSON: u32,
    pub pbAuthenticationResponseJSON: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WEBAUTHN_CREDENTIAL struct {
	dwVersion uint32
	cbId uint32
	pbId uintptr
	pwszCredentialType uintptr
}

type WEBAUTHN_EXTENSIONS struct {
	cExtensions uint32
	pExtensions uintptr
}

type WEBAUTHN_ASSERTION struct {
	dwVersion uint32
	cbAuthenticatorData uint32
	pbAuthenticatorData uintptr
	cbSignature uint32
	pbSignature uintptr
	Credential WEBAUTHN_CREDENTIAL
	cbUserId uint32
	pbUserId uintptr
	Extensions WEBAUTHN_EXTENSIONS
	cbCredLargeBlob uint32
	pbCredLargeBlob uintptr
	dwCredLargeBlobStatus uint32
	pHmacSecret uintptr
	dwUsedTransport uint32
	cbUnsignedExtensionOutputs uint32
	pbUnsignedExtensionOutputs uintptr
	cbClientDataJSON uint32
	pbClientDataJSON uintptr
	cbAuthenticationResponseJSON uint32
	pbAuthenticationResponseJSON uintptr
}
type
  WEBAUTHN_CREDENTIAL = record
    dwVersion: DWORD;
    cbId: DWORD;
    pbId: Pointer;
    pwszCredentialType: Pointer;
  end;

  WEBAUTHN_EXTENSIONS = record
    cExtensions: DWORD;
    pExtensions: Pointer;
  end;

  WEBAUTHN_ASSERTION = record
    dwVersion: DWORD;
    cbAuthenticatorData: DWORD;
    pbAuthenticatorData: Pointer;
    cbSignature: DWORD;
    pbSignature: Pointer;
    Credential: WEBAUTHN_CREDENTIAL;
    cbUserId: DWORD;
    pbUserId: Pointer;
    Extensions: WEBAUTHN_EXTENSIONS;
    cbCredLargeBlob: DWORD;
    pbCredLargeBlob: Pointer;
    dwCredLargeBlobStatus: DWORD;
    pHmacSecret: Pointer;
    dwUsedTransport: DWORD;
    cbUnsignedExtensionOutputs: DWORD;
    pbUnsignedExtensionOutputs: Pointer;
    cbClientDataJSON: DWORD;
    pbClientDataJSON: Pointer;
    cbAuthenticationResponseJSON: DWORD;
    pbAuthenticationResponseJSON: Pointer;
  end;
const WEBAUTHN_CREDENTIAL = extern struct {
    dwVersion: u32,
    cbId: u32,
    pbId: ?*anyopaque,
    pwszCredentialType: ?*anyopaque,
};

const WEBAUTHN_EXTENSIONS = extern struct {
    cExtensions: u32,
    pExtensions: ?*anyopaque,
};

const WEBAUTHN_ASSERTION = extern struct {
    dwVersion: u32,
    cbAuthenticatorData: u32,
    pbAuthenticatorData: ?*anyopaque,
    cbSignature: u32,
    pbSignature: ?*anyopaque,
    Credential: WEBAUTHN_CREDENTIAL,
    cbUserId: u32,
    pbUserId: ?*anyopaque,
    Extensions: WEBAUTHN_EXTENSIONS,
    cbCredLargeBlob: u32,
    pbCredLargeBlob: ?*anyopaque,
    dwCredLargeBlobStatus: u32,
    pHmacSecret: ?*anyopaque,
    dwUsedTransport: u32,
    cbUnsignedExtensionOutputs: u32,
    pbUnsignedExtensionOutputs: ?*anyopaque,
    cbClientDataJSON: u32,
    pbClientDataJSON: ?*anyopaque,
    cbAuthenticationResponseJSON: u32,
    pbAuthenticationResponseJSON: ?*anyopaque,
};
type
  WEBAUTHN_CREDENTIAL {.bycopy.} = object
    dwVersion: uint32
    cbId: uint32
    pbId: pointer
    pwszCredentialType: pointer

  WEBAUTHN_EXTENSIONS {.bycopy.} = object
    cExtensions: uint32
    pExtensions: pointer

  WEBAUTHN_ASSERTION {.bycopy.} = object
    dwVersion: uint32
    cbAuthenticatorData: uint32
    pbAuthenticatorData: pointer
    cbSignature: uint32
    pbSignature: pointer
    Credential: WEBAUTHN_CREDENTIAL
    cbUserId: uint32
    pbUserId: pointer
    Extensions: WEBAUTHN_EXTENSIONS
    cbCredLargeBlob: uint32
    pbCredLargeBlob: pointer
    dwCredLargeBlobStatus: uint32
    pHmacSecret: pointer
    dwUsedTransport: uint32
    cbUnsignedExtensionOutputs: uint32
    pbUnsignedExtensionOutputs: pointer
    cbClientDataJSON: uint32
    pbClientDataJSON: pointer
    cbAuthenticationResponseJSON: uint32
    pbAuthenticationResponseJSON: pointer
struct WEBAUTHN_CREDENTIAL
{
    uint dwVersion;
    uint cbId;
    void* pbId;
    void* pwszCredentialType;
}

struct WEBAUTHN_EXTENSIONS
{
    uint cExtensions;
    void* pExtensions;
}

struct WEBAUTHN_ASSERTION
{
    uint dwVersion;
    uint cbAuthenticatorData;
    void* pbAuthenticatorData;
    uint cbSignature;
    void* pbSignature;
    WEBAUTHN_CREDENTIAL Credential;
    uint cbUserId;
    void* pbUserId;
    WEBAUTHN_EXTENSIONS Extensions;
    uint cbCredLargeBlob;
    void* pbCredLargeBlob;
    uint dwCredLargeBlobStatus;
    void* pHmacSecret;
    uint dwUsedTransport;
    uint cbUnsignedExtensionOutputs;
    void* pbUnsignedExtensionOutputs;
    uint cbClientDataJSON;
    void* pbClientDataJSON;
    uint cbAuthenticationResponseJSON;
    void* pbAuthenticationResponseJSON;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WEBAUTHN_ASSERTION サイズ: 96 バイト(x86)
dim st, 24    ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; cbAuthenticatorData : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pbAuthenticatorData : BYTE* (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; cbSignature : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; pbSignature : BYTE* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Credential : WEBAUTHN_CREDENTIAL (+20, 16byte)  varptr(st)+20 を基点に操作(16byte:入れ子/配列)
; cbUserId : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; pbUserId : BYTE* (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; Extensions : WEBAUTHN_EXTENSIONS (+44, 8byte)  varptr(st)+44 を基点に操作(8byte:入れ子/配列)
; cbCredLargeBlob : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; pbCredLargeBlob : BYTE* (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; dwCredLargeBlobStatus : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; pHmacSecret : WEBAUTHN_HMAC_SECRET_SALT* (+64, 4byte)  varptr(st)+64 を基点に操作(4byte:入れ子/配列)
; dwUsedTransport : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; cbUnsignedExtensionOutputs : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; cbClientDataJSON : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; pbClientDataJSON : BYTE* (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; cbAuthenticationResponseJSON : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; pbAuthenticationResponseJSON : BYTE* (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WEBAUTHN_ASSERTION サイズ: 168 バイト(x64)
dim st, 42    ; 4byte整数×42(構造体サイズ 168 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; cbAuthenticatorData : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; pbAuthenticatorData : BYTE* (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; cbSignature : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pbSignature : BYTE* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; Credential : WEBAUTHN_CREDENTIAL (+32, 24byte)  varptr(st)+32 を基点に操作(24byte:入れ子/配列)
; cbUserId : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; pbUserId : BYTE* (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; Extensions : WEBAUTHN_EXTENSIONS (+72, 16byte)  varptr(st)+72 を基点に操作(16byte:入れ子/配列)
; cbCredLargeBlob : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; pbCredLargeBlob : BYTE* (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; dwCredLargeBlobStatus : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; pHmacSecret : WEBAUTHN_HMAC_SECRET_SALT* (+112, 8byte)  varptr(st)+112 を基点に操作(8byte:入れ子/配列)
; dwUsedTransport : DWORD (+120, 4byte)  st.30 = 値  /  値 = st.30   (lpoke/lpeek も可)
; cbUnsignedExtensionOutputs : DWORD (+124, 4byte)  st.31 = 値  /  値 = st.31   (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+128, 8byte)  qpoke st,128,値 / qpeek(st,128)  ※IronHSPのみ。3.7/3.8は lpoke st,128,下位 : lpoke st,132,上位
; cbClientDataJSON : DWORD (+136, 4byte)  st.34 = 値  /  値 = st.34   (lpoke/lpeek も可)
; pbClientDataJSON : BYTE* (+144, 8byte)  qpoke st,144,値 / qpeek(st,144)  ※IronHSPのみ。3.7/3.8は lpoke st,144,下位 : lpoke st,148,上位
; cbAuthenticationResponseJSON : DWORD (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; pbAuthenticationResponseJSON : BYTE* (+160, 8byte)  qpoke st,160,値 / qpeek(st,160)  ※IronHSPのみ。3.7/3.8は lpoke st,160,下位 : lpoke st,164,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WEBAUTHN_CREDENTIAL
    #field int dwVersion
    #field int cbId
    #field intptr pbId
    #field intptr pwszCredentialType
#endstruct

#defstruct global WEBAUTHN_EXTENSIONS
    #field int cExtensions
    #field intptr pExtensions
#endstruct

#defstruct global WEBAUTHN_ASSERTION
    #field int dwVersion
    #field int cbAuthenticatorData
    #field intptr pbAuthenticatorData
    #field int cbSignature
    #field intptr pbSignature
    #field WEBAUTHN_CREDENTIAL Credential
    #field int cbUserId
    #field intptr pbUserId
    #field WEBAUTHN_EXTENSIONS Extensions
    #field int cbCredLargeBlob
    #field intptr pbCredLargeBlob
    #field int dwCredLargeBlobStatus
    #field intptr pHmacSecret
    #field int dwUsedTransport
    #field int cbUnsignedExtensionOutputs
    #field intptr pbUnsignedExtensionOutputs
    #field int cbClientDataJSON
    #field intptr pbClientDataJSON
    #field int cbAuthenticationResponseJSON
    #field intptr pbAuthenticationResponseJSON
#endstruct

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