ホーム › Security.Authentication.WebAuthn › WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| WebAuthNAssertion | WEBAUTHN_ASSERTION | 168/96 | +0 | +0 | 取得されたアサーション(WEBAUTHN_ASSERTION)を保持する。 |
| pUserInformation | WEBAUTHN_USER_ENTITY_INFORMATION* | 8/4 | +168 | +96 | アサーションに対応するユーザー情報へのポインタ。 |
| dwNumberOfCredentials | DWORD | 4 | +176 | +100 | 一致した資格情報の総数を示す。 |
| lUserSelected | INT | 4 | +180 | +104 | ユーザーが選択したかを示す値。 |
| cbLargeBlobKey | DWORD | 4 | +184 | +108 | large blob鍵のバイト数を示す。 |
| pbLargeBlobKey | BYTE* | 8/4 | +192 | +112 | large blobの暗号化鍵へのポインタ。 |
| cbUnsignedExtensionOutputs | DWORD | 4 | +200 | +116 | 署名対象外拡張出力のバイト数を示す。 |
| pbUnsignedExtensionOutputs | BYTE* | 8/4 | +208 | +120 | 署名対象外の拡張出力データへのポインタ。 |
各言語での定義
#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;
// WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE (x64 216 / x86 124 バイト)
typedef struct WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE {
WEBAUTHN_ASSERTION WebAuthNAssertion;
WEBAUTHN_USER_ENTITY_INFORMATION* pUserInformation;
DWORD dwNumberOfCredentials;
INT lUserSelected;
DWORD cbLargeBlobKey;
BYTE* pbLargeBlobKey;
DWORD cbUnsignedExtensionOutputs;
BYTE* pbUnsignedExtensionOutputs;
} WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE;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;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
{
public WEBAUTHN_ASSERTION WebAuthNAssertion;
public IntPtr pUserInformation;
public uint dwNumberOfCredentials;
public int lUserSelected;
public uint cbLargeBlobKey;
public IntPtr pbLargeBlobKey;
public uint cbUnsignedExtensionOutputs;
public IntPtr pbUnsignedExtensionOutputs;
}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
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
Public WebAuthNAssertion As WEBAUTHN_ASSERTION
Public pUserInformation As IntPtr
Public dwNumberOfCredentials As UInteger
Public lUserSelected As Integer
Public cbLargeBlobKey As UInteger
Public pbLargeBlobKey As IntPtr
Public cbUnsignedExtensionOutputs As UInteger
Public pbUnsignedExtensionOutputs As IntPtr
End Structureimport 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),
]
class WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE(ctypes.Structure):
_fields_ = [
("WebAuthNAssertion", WEBAUTHN_ASSERTION),
("pUserInformation", ctypes.c_void_p),
("dwNumberOfCredentials", wintypes.DWORD),
("lUserSelected", ctypes.c_int),
("cbLargeBlobKey", wintypes.DWORD),
("pbLargeBlobKey", ctypes.c_void_p),
("cbUnsignedExtensionOutputs", wintypes.DWORD),
("pbUnsignedExtensionOutputs", 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,
}
#[repr(C)]
pub struct WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE {
pub WebAuthNAssertion: WEBAUTHN_ASSERTION,
pub pUserInformation: *mut core::ffi::c_void,
pub dwNumberOfCredentials: u32,
pub lUserSelected: i32,
pub cbLargeBlobKey: u32,
pub pbLargeBlobKey: *mut core::ffi::c_void,
pub cbUnsignedExtensionOutputs: u32,
pub pbUnsignedExtensionOutputs: *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_CTAPCBOR_GET_ASSERTION_RESPONSE struct {
WebAuthNAssertion WEBAUTHN_ASSERTION
pUserInformation uintptr
dwNumberOfCredentials uint32
lUserSelected int32
cbLargeBlobKey uint32
pbLargeBlobKey uintptr
cbUnsignedExtensionOutputs uint32
pbUnsignedExtensionOutputs 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;
WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE = record
WebAuthNAssertion: WEBAUTHN_ASSERTION;
pUserInformation: Pointer;
dwNumberOfCredentials: DWORD;
lUserSelected: Integer;
cbLargeBlobKey: DWORD;
pbLargeBlobKey: Pointer;
cbUnsignedExtensionOutputs: DWORD;
pbUnsignedExtensionOutputs: 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,
};
const WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE = extern struct {
WebAuthNAssertion: WEBAUTHN_ASSERTION,
pUserInformation: ?*anyopaque,
dwNumberOfCredentials: u32,
lUserSelected: i32,
cbLargeBlobKey: u32,
pbLargeBlobKey: ?*anyopaque,
cbUnsignedExtensionOutputs: u32,
pbUnsignedExtensionOutputs: ?*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
WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE {.bycopy.} = object
WebAuthNAssertion: WEBAUTHN_ASSERTION
pUserInformation: pointer
dwNumberOfCredentials: uint32
lUserSelected: int32
cbLargeBlobKey: uint32
pbLargeBlobKey: pointer
cbUnsignedExtensionOutputs: uint32
pbUnsignedExtensionOutputs: pointerstruct 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;
}
struct WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
{
WEBAUTHN_ASSERTION WebAuthNAssertion;
void* pUserInformation;
uint dwNumberOfCredentials;
int lUserSelected;
uint cbLargeBlobKey;
void* pbLargeBlobKey;
uint cbUnsignedExtensionOutputs;
void* pbUnsignedExtensionOutputs;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE サイズ: 124 バイト(x86)
dim st, 31 ; 4byte整数×31(構造体サイズ 124 / 4 切り上げ)
; WebAuthNAssertion : WEBAUTHN_ASSERTION (+0, 96byte) varptr(st)+0 を基点に操作(96byte:入れ子/配列)
; pUserInformation : WEBAUTHN_USER_ENTITY_INFORMATION* (+96, 4byte) varptr(st)+96 を基点に操作(4byte:入れ子/配列)
; dwNumberOfCredentials : DWORD (+100, 4byte) st.25 = 値 / 値 = st.25 (lpoke/lpeek も可)
; lUserSelected : INT (+104, 4byte) st.26 = 値 / 値 = st.26 (lpoke/lpeek も可)
; cbLargeBlobKey : DWORD (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; pbLargeBlobKey : BYTE* (+112, 4byte) st.28 = 値 / 値 = st.28 (lpoke/lpeek も可)
; cbUnsignedExtensionOutputs : DWORD (+116, 4byte) st.29 = 値 / 値 = st.29 (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+120, 4byte) st.30 = 値 / 値 = st.30 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE サイズ: 216 バイト(x64)
dim st, 54 ; 4byte整数×54(構造体サイズ 216 / 4 切り上げ)
; WebAuthNAssertion : WEBAUTHN_ASSERTION (+0, 168byte) varptr(st)+0 を基点に操作(168byte:入れ子/配列)
; pUserInformation : WEBAUTHN_USER_ENTITY_INFORMATION* (+168, 8byte) varptr(st)+168 を基点に操作(8byte:入れ子/配列)
; dwNumberOfCredentials : DWORD (+176, 4byte) st.44 = 値 / 値 = st.44 (lpoke/lpeek も可)
; lUserSelected : INT (+180, 4byte) st.45 = 値 / 値 = st.45 (lpoke/lpeek も可)
; cbLargeBlobKey : DWORD (+184, 4byte) st.46 = 値 / 値 = st.46 (lpoke/lpeek も可)
; pbLargeBlobKey : BYTE* (+192, 8byte) qpoke st,192,値 / qpeek(st,192) ※IronHSPのみ。3.7/3.8は lpoke st,192,下位 : lpoke st,196,上位
; cbUnsignedExtensionOutputs : DWORD (+200, 4byte) st.50 = 値 / 値 = st.50 (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+208, 8byte) qpoke st,208,値 / qpeek(st,208) ※IronHSPのみ。3.7/3.8は lpoke st,208,下位 : lpoke st,212,上位
; ※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
#defstruct global WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE
#field WEBAUTHN_ASSERTION WebAuthNAssertion
#field intptr pUserInformation
#field int dwNumberOfCredentials
#field int lUserSelected
#field int cbLargeBlobKey
#field intptr pbLargeBlobKey
#field int cbUnsignedExtensionOutputs
#field intptr pbUnsignedExtensionOutputs
#endstruct
stdim st, WEBAUTHN_CTAPCBOR_GET_ASSERTION_RESPONSE ; NSTRUCT 変数を確保
st->dwNumberOfCredentials = 100
mes "dwNumberOfCredentials=" + st->dwNumberOfCredentials