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

WEBAUTHN_CREDENTIAL_ATTESTATION

構造体
サイズx64: 192 バイト / x86: 112 バイト

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

フィールド

フィールドサイズx64x86説明
dwVersionDWORD4+0+0この構造体のバージョン番号を示す。
pwszFormatTypeLPWSTR8/4+8+4アテステーション形式の種別文字列へのポインタ。
cbAuthenticatorDataDWORD4+16+8認証器データのバイト数を示す。
pbAuthenticatorDataBYTE*8/4+24+12認証器データ(authenticatorData)へのポインタ。
cbAttestationDWORD4+32+16アテステーションステートメントのバイト数を示す。
pbAttestationBYTE*8/4+40+20アテステーションステートメントデータへのポインタ。
dwAttestationDecodeTypeDWORD4+48+24アテステーションの復号形式を示す値。
pvAttestationDecodevoid*8/4+56+28復号済みアテステーション構造へのポインタ。NULL可。
cbAttestationObjectDWORD4+64+32アテステーションオブジェクト全体のバイト数を示す。
pbAttestationObjectBYTE*8/4+72+36CBORエンコードされたアテステーションオブジェクトへのポインタ。
cbCredentialIdDWORD4+80+40資格情報IDのバイト数を示す。
pbCredentialIdBYTE*8/4+88+44生成された資格情報IDへのポインタ。
ExtensionsWEBAUTHN_EXTENSIONS16/8+96+48作成結果に含まれるWebAuthn拡張の集合を保持する。
dwUsedTransportDWORD4+112+56使用された認証器トランスポートを示すビット値。
bEpAttBOOL4+116+60エンタープライズアテステーションが返されたかを示すブール値。
bLargeBlobSupportedBOOL4+120+64large blobがサポートされたかを示すブール値。
bResidentKeyBOOL4+124+68常駐鍵として作成されたかを示すブール値。
bPrfEnabledBOOL4+128+72PRF拡張が有効化されたかを示すブール値。
cbUnsignedExtensionOutputsDWORD4+132+76署名対象外拡張出力のバイト数を示す。
pbUnsignedExtensionOutputsBYTE*8/4+136+80署名対象外の拡張出力データへのポインタ。
pHmacSecretWEBAUTHN_HMAC_SECRET_SALT*8/4+144+84hmac-secret拡張の結果ソルトへのポインタ。NULL可。
bThirdPartyPaymentBOOL4+152+88サードパーティ決済対応で作成されたかを示すブール値。
dwTransportsDWORD4+156+92資格情報が利用可能なトランスポートを示すビットマスク。
cbClientDataJSONDWORD4+160+96クライアントデータJSONのバイト数を示す。
pbClientDataJSONBYTE*8/4+168+100クライアントデータJSONへのポインタ。
cbRegistrationResponseJSONDWORD4+176+104登録応答JSONのバイト数を示す。
pbRegistrationResponseJSONBYTE*8/4+184+108登録応答JSONデータへのポインタ。

各言語での定義

#include <windows.h>

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

// WEBAUTHN_CREDENTIAL_ATTESTATION  (x64 192 / x86 112 バイト)
typedef struct WEBAUTHN_CREDENTIAL_ATTESTATION {
    DWORD dwVersion;
    LPWSTR pwszFormatType;
    DWORD cbAuthenticatorData;
    BYTE* pbAuthenticatorData;
    DWORD cbAttestation;
    BYTE* pbAttestation;
    DWORD dwAttestationDecodeType;
    void* pvAttestationDecode;
    DWORD cbAttestationObject;
    BYTE* pbAttestationObject;
    DWORD cbCredentialId;
    BYTE* pbCredentialId;
    WEBAUTHN_EXTENSIONS Extensions;
    DWORD dwUsedTransport;
    BOOL bEpAtt;
    BOOL bLargeBlobSupported;
    BOOL bResidentKey;
    BOOL bPrfEnabled;
    DWORD cbUnsignedExtensionOutputs;
    BYTE* pbUnsignedExtensionOutputs;
    WEBAUTHN_HMAC_SECRET_SALT* pHmacSecret;
    BOOL bThirdPartyPayment;
    DWORD dwTransports;
    DWORD cbClientDataJSON;
    BYTE* pbClientDataJSON;
    DWORD cbRegistrationResponseJSON;
    BYTE* pbRegistrationResponseJSON;
} WEBAUTHN_CREDENTIAL_ATTESTATION;
using System;
using System.Runtime.InteropServices;

[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_CREDENTIAL_ATTESTATION
{
    public uint dwVersion;
    public IntPtr pwszFormatType;
    public uint cbAuthenticatorData;
    public IntPtr pbAuthenticatorData;
    public uint cbAttestation;
    public IntPtr pbAttestation;
    public uint dwAttestationDecodeType;
    public IntPtr pvAttestationDecode;
    public uint cbAttestationObject;
    public IntPtr pbAttestationObject;
    public uint cbCredentialId;
    public IntPtr pbCredentialId;
    public WEBAUTHN_EXTENSIONS Extensions;
    public uint dwUsedTransport;
    [MarshalAs(UnmanagedType.Bool)] public bool bEpAtt;
    [MarshalAs(UnmanagedType.Bool)] public bool bLargeBlobSupported;
    [MarshalAs(UnmanagedType.Bool)] public bool bResidentKey;
    [MarshalAs(UnmanagedType.Bool)] public bool bPrfEnabled;
    public uint cbUnsignedExtensionOutputs;
    public IntPtr pbUnsignedExtensionOutputs;
    public IntPtr pHmacSecret;
    [MarshalAs(UnmanagedType.Bool)] public bool bThirdPartyPayment;
    public uint dwTransports;
    public uint cbClientDataJSON;
    public IntPtr pbClientDataJSON;
    public uint cbRegistrationResponseJSON;
    public IntPtr pbRegistrationResponseJSON;
}
Imports System.Runtime.InteropServices

<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_CREDENTIAL_ATTESTATION
    Public dwVersion As UInteger
    Public pwszFormatType As IntPtr
    Public cbAuthenticatorData As UInteger
    Public pbAuthenticatorData As IntPtr
    Public cbAttestation As UInteger
    Public pbAttestation As IntPtr
    Public dwAttestationDecodeType As UInteger
    Public pvAttestationDecode As IntPtr
    Public cbAttestationObject As UInteger
    Public pbAttestationObject As IntPtr
    Public cbCredentialId As UInteger
    Public pbCredentialId As IntPtr
    Public Extensions As WEBAUTHN_EXTENSIONS
    Public dwUsedTransport As UInteger
    <MarshalAs(UnmanagedType.Bool)> Public bEpAtt As Boolean
    <MarshalAs(UnmanagedType.Bool)> Public bLargeBlobSupported As Boolean
    <MarshalAs(UnmanagedType.Bool)> Public bResidentKey As Boolean
    <MarshalAs(UnmanagedType.Bool)> Public bPrfEnabled As Boolean
    Public cbUnsignedExtensionOutputs As UInteger
    Public pbUnsignedExtensionOutputs As IntPtr
    Public pHmacSecret As IntPtr
    <MarshalAs(UnmanagedType.Bool)> Public bThirdPartyPayment As Boolean
    Public dwTransports As UInteger
    Public cbClientDataJSON As UInteger
    Public pbClientDataJSON As IntPtr
    Public cbRegistrationResponseJSON As UInteger
    Public pbRegistrationResponseJSON As IntPtr
End Structure
import ctypes
from ctypes import wintypes

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

class WEBAUTHN_CREDENTIAL_ATTESTATION(ctypes.Structure):
    _fields_ = [
        ("dwVersion", wintypes.DWORD),
        ("pwszFormatType", ctypes.c_void_p),
        ("cbAuthenticatorData", wintypes.DWORD),
        ("pbAuthenticatorData", ctypes.c_void_p),
        ("cbAttestation", wintypes.DWORD),
        ("pbAttestation", ctypes.c_void_p),
        ("dwAttestationDecodeType", wintypes.DWORD),
        ("pvAttestationDecode", ctypes.c_void_p),
        ("cbAttestationObject", wintypes.DWORD),
        ("pbAttestationObject", ctypes.c_void_p),
        ("cbCredentialId", wintypes.DWORD),
        ("pbCredentialId", ctypes.c_void_p),
        ("Extensions", WEBAUTHN_EXTENSIONS),
        ("dwUsedTransport", wintypes.DWORD),
        ("bEpAtt", wintypes.BOOL),
        ("bLargeBlobSupported", wintypes.BOOL),
        ("bResidentKey", wintypes.BOOL),
        ("bPrfEnabled", wintypes.BOOL),
        ("cbUnsignedExtensionOutputs", wintypes.DWORD),
        ("pbUnsignedExtensionOutputs", ctypes.c_void_p),
        ("pHmacSecret", ctypes.c_void_p),
        ("bThirdPartyPayment", wintypes.BOOL),
        ("dwTransports", wintypes.DWORD),
        ("cbClientDataJSON", wintypes.DWORD),
        ("pbClientDataJSON", ctypes.c_void_p),
        ("cbRegistrationResponseJSON", wintypes.DWORD),
        ("pbRegistrationResponseJSON", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct WEBAUTHN_EXTENSIONS {
    pub cExtensions: u32,
    pub pExtensions: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct WEBAUTHN_CREDENTIAL_ATTESTATION {
    pub dwVersion: u32,
    pub pwszFormatType: *mut core::ffi::c_void,
    pub cbAuthenticatorData: u32,
    pub pbAuthenticatorData: *mut core::ffi::c_void,
    pub cbAttestation: u32,
    pub pbAttestation: *mut core::ffi::c_void,
    pub dwAttestationDecodeType: u32,
    pub pvAttestationDecode: *mut core::ffi::c_void,
    pub cbAttestationObject: u32,
    pub pbAttestationObject: *mut core::ffi::c_void,
    pub cbCredentialId: u32,
    pub pbCredentialId: *mut core::ffi::c_void,
    pub Extensions: WEBAUTHN_EXTENSIONS,
    pub dwUsedTransport: u32,
    pub bEpAtt: i32,
    pub bLargeBlobSupported: i32,
    pub bResidentKey: i32,
    pub bPrfEnabled: i32,
    pub cbUnsignedExtensionOutputs: u32,
    pub pbUnsignedExtensionOutputs: *mut core::ffi::c_void,
    pub pHmacSecret: *mut core::ffi::c_void,
    pub bThirdPartyPayment: i32,
    pub dwTransports: u32,
    pub cbClientDataJSON: u32,
    pub pbClientDataJSON: *mut core::ffi::c_void,
    pub cbRegistrationResponseJSON: u32,
    pub pbRegistrationResponseJSON: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type WEBAUTHN_EXTENSIONS struct {
	cExtensions uint32
	pExtensions uintptr
}

type WEBAUTHN_CREDENTIAL_ATTESTATION struct {
	dwVersion uint32
	pwszFormatType uintptr
	cbAuthenticatorData uint32
	pbAuthenticatorData uintptr
	cbAttestation uint32
	pbAttestation uintptr
	dwAttestationDecodeType uint32
	pvAttestationDecode uintptr
	cbAttestationObject uint32
	pbAttestationObject uintptr
	cbCredentialId uint32
	pbCredentialId uintptr
	Extensions WEBAUTHN_EXTENSIONS
	dwUsedTransport uint32
	bEpAtt int32
	bLargeBlobSupported int32
	bResidentKey int32
	bPrfEnabled int32
	cbUnsignedExtensionOutputs uint32
	pbUnsignedExtensionOutputs uintptr
	pHmacSecret uintptr
	bThirdPartyPayment int32
	dwTransports uint32
	cbClientDataJSON uint32
	pbClientDataJSON uintptr
	cbRegistrationResponseJSON uint32
	pbRegistrationResponseJSON uintptr
}
type
  WEBAUTHN_EXTENSIONS = record
    cExtensions: DWORD;
    pExtensions: Pointer;
  end;

  WEBAUTHN_CREDENTIAL_ATTESTATION = record
    dwVersion: DWORD;
    pwszFormatType: Pointer;
    cbAuthenticatorData: DWORD;
    pbAuthenticatorData: Pointer;
    cbAttestation: DWORD;
    pbAttestation: Pointer;
    dwAttestationDecodeType: DWORD;
    pvAttestationDecode: Pointer;
    cbAttestationObject: DWORD;
    pbAttestationObject: Pointer;
    cbCredentialId: DWORD;
    pbCredentialId: Pointer;
    Extensions: WEBAUTHN_EXTENSIONS;
    dwUsedTransport: DWORD;
    bEpAtt: BOOL;
    bLargeBlobSupported: BOOL;
    bResidentKey: BOOL;
    bPrfEnabled: BOOL;
    cbUnsignedExtensionOutputs: DWORD;
    pbUnsignedExtensionOutputs: Pointer;
    pHmacSecret: Pointer;
    bThirdPartyPayment: BOOL;
    dwTransports: DWORD;
    cbClientDataJSON: DWORD;
    pbClientDataJSON: Pointer;
    cbRegistrationResponseJSON: DWORD;
    pbRegistrationResponseJSON: Pointer;
  end;
const WEBAUTHN_EXTENSIONS = extern struct {
    cExtensions: u32,
    pExtensions: ?*anyopaque,
};

const WEBAUTHN_CREDENTIAL_ATTESTATION = extern struct {
    dwVersion: u32,
    pwszFormatType: ?*anyopaque,
    cbAuthenticatorData: u32,
    pbAuthenticatorData: ?*anyopaque,
    cbAttestation: u32,
    pbAttestation: ?*anyopaque,
    dwAttestationDecodeType: u32,
    pvAttestationDecode: ?*anyopaque,
    cbAttestationObject: u32,
    pbAttestationObject: ?*anyopaque,
    cbCredentialId: u32,
    pbCredentialId: ?*anyopaque,
    Extensions: WEBAUTHN_EXTENSIONS,
    dwUsedTransport: u32,
    bEpAtt: i32,
    bLargeBlobSupported: i32,
    bResidentKey: i32,
    bPrfEnabled: i32,
    cbUnsignedExtensionOutputs: u32,
    pbUnsignedExtensionOutputs: ?*anyopaque,
    pHmacSecret: ?*anyopaque,
    bThirdPartyPayment: i32,
    dwTransports: u32,
    cbClientDataJSON: u32,
    pbClientDataJSON: ?*anyopaque,
    cbRegistrationResponseJSON: u32,
    pbRegistrationResponseJSON: ?*anyopaque,
};
type
  WEBAUTHN_EXTENSIONS {.bycopy.} = object
    cExtensions: uint32
    pExtensions: pointer

  WEBAUTHN_CREDENTIAL_ATTESTATION {.bycopy.} = object
    dwVersion: uint32
    pwszFormatType: pointer
    cbAuthenticatorData: uint32
    pbAuthenticatorData: pointer
    cbAttestation: uint32
    pbAttestation: pointer
    dwAttestationDecodeType: uint32
    pvAttestationDecode: pointer
    cbAttestationObject: uint32
    pbAttestationObject: pointer
    cbCredentialId: uint32
    pbCredentialId: pointer
    Extensions: WEBAUTHN_EXTENSIONS
    dwUsedTransport: uint32
    bEpAtt: int32
    bLargeBlobSupported: int32
    bResidentKey: int32
    bPrfEnabled: int32
    cbUnsignedExtensionOutputs: uint32
    pbUnsignedExtensionOutputs: pointer
    pHmacSecret: pointer
    bThirdPartyPayment: int32
    dwTransports: uint32
    cbClientDataJSON: uint32
    pbClientDataJSON: pointer
    cbRegistrationResponseJSON: uint32
    pbRegistrationResponseJSON: pointer
struct WEBAUTHN_EXTENSIONS
{
    uint cExtensions;
    void* pExtensions;
}

struct WEBAUTHN_CREDENTIAL_ATTESTATION
{
    uint dwVersion;
    void* pwszFormatType;
    uint cbAuthenticatorData;
    void* pbAuthenticatorData;
    uint cbAttestation;
    void* pbAttestation;
    uint dwAttestationDecodeType;
    void* pvAttestationDecode;
    uint cbAttestationObject;
    void* pbAttestationObject;
    uint cbCredentialId;
    void* pbCredentialId;
    WEBAUTHN_EXTENSIONS Extensions;
    uint dwUsedTransport;
    int bEpAtt;
    int bLargeBlobSupported;
    int bResidentKey;
    int bPrfEnabled;
    uint cbUnsignedExtensionOutputs;
    void* pbUnsignedExtensionOutputs;
    void* pHmacSecret;
    int bThirdPartyPayment;
    uint dwTransports;
    uint cbClientDataJSON;
    void* pbClientDataJSON;
    uint cbRegistrationResponseJSON;
    void* pbRegistrationResponseJSON;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WEBAUTHN_CREDENTIAL_ATTESTATION サイズ: 112 バイト(x86)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pwszFormatType : LPWSTR (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; cbAuthenticatorData : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; pbAuthenticatorData : BYTE* (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; cbAttestation : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pbAttestation : BYTE* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwAttestationDecodeType : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; pvAttestationDecode : void* (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; cbAttestationObject : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pbAttestationObject : BYTE* (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; cbCredentialId : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; pbCredentialId : BYTE* (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; Extensions : WEBAUTHN_EXTENSIONS (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; dwUsedTransport : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; bEpAtt : BOOL (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; bLargeBlobSupported : BOOL (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; bResidentKey : BOOL (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; bPrfEnabled : BOOL (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; cbUnsignedExtensionOutputs : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; pHmacSecret : WEBAUTHN_HMAC_SECRET_SALT* (+84, 4byte)  varptr(st)+84 を基点に操作(4byte:入れ子/配列)
; bThirdPartyPayment : BOOL (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; dwTransports : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; cbClientDataJSON : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; pbClientDataJSON : BYTE* (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; cbRegistrationResponseJSON : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; pbRegistrationResponseJSON : BYTE* (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WEBAUTHN_CREDENTIAL_ATTESTATION サイズ: 192 バイト(x64)
dim st, 48    ; 4byte整数×48(構造体サイズ 192 / 4 切り上げ)
; dwVersion : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; pwszFormatType : LPWSTR (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; cbAuthenticatorData : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; pbAuthenticatorData : BYTE* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; cbAttestation : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; pbAttestation : BYTE* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; dwAttestationDecodeType : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; pvAttestationDecode : void* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; cbAttestationObject : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; pbAttestationObject : BYTE* (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; cbCredentialId : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; pbCredentialId : BYTE* (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; Extensions : WEBAUTHN_EXTENSIONS (+96, 16byte)  varptr(st)+96 を基点に操作(16byte:入れ子/配列)
; dwUsedTransport : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; bEpAtt : BOOL (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; bLargeBlobSupported : BOOL (+120, 4byte)  st.30 = 値  /  値 = st.30   (lpoke/lpeek も可)
; bResidentKey : BOOL (+124, 4byte)  st.31 = 値  /  値 = st.31   (lpoke/lpeek も可)
; bPrfEnabled : BOOL (+128, 4byte)  st.32 = 値  /  値 = st.32   (lpoke/lpeek も可)
; cbUnsignedExtensionOutputs : DWORD (+132, 4byte)  st.33 = 値  /  値 = st.33   (lpoke/lpeek も可)
; pbUnsignedExtensionOutputs : BYTE* (+136, 8byte)  qpoke st,136,値 / qpeek(st,136)  ※IronHSPのみ。3.7/3.8は lpoke st,136,下位 : lpoke st,140,上位
; pHmacSecret : WEBAUTHN_HMAC_SECRET_SALT* (+144, 8byte)  varptr(st)+144 を基点に操作(8byte:入れ子/配列)
; bThirdPartyPayment : BOOL (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; dwTransports : DWORD (+156, 4byte)  st.39 = 値  /  値 = st.39   (lpoke/lpeek も可)
; cbClientDataJSON : DWORD (+160, 4byte)  st.40 = 値  /  値 = st.40   (lpoke/lpeek も可)
; pbClientDataJSON : BYTE* (+168, 8byte)  qpoke st,168,値 / qpeek(st,168)  ※IronHSPのみ。3.7/3.8は lpoke st,168,下位 : lpoke st,172,上位
; cbRegistrationResponseJSON : DWORD (+176, 4byte)  st.44 = 値  /  値 = st.44   (lpoke/lpeek も可)
; pbRegistrationResponseJSON : BYTE* (+184, 8byte)  qpoke st,184,値 / qpeek(st,184)  ※IronHSPのみ。3.7/3.8は lpoke st,184,下位 : lpoke st,188,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WEBAUTHN_EXTENSIONS
    #field int cExtensions
    #field intptr pExtensions
#endstruct

#defstruct global WEBAUTHN_CREDENTIAL_ATTESTATION
    #field int dwVersion
    #field intptr pwszFormatType
    #field int cbAuthenticatorData
    #field intptr pbAuthenticatorData
    #field int cbAttestation
    #field intptr pbAttestation
    #field int dwAttestationDecodeType
    #field intptr pvAttestationDecode
    #field int cbAttestationObject
    #field intptr pbAttestationObject
    #field int cbCredentialId
    #field intptr pbCredentialId
    #field WEBAUTHN_EXTENSIONS Extensions
    #field int dwUsedTransport
    #field bool bEpAtt
    #field bool bLargeBlobSupported
    #field bool bResidentKey
    #field bool bPrfEnabled
    #field int cbUnsignedExtensionOutputs
    #field intptr pbUnsignedExtensionOutputs
    #field intptr pHmacSecret
    #field bool bThirdPartyPayment
    #field int dwTransports
    #field int cbClientDataJSON
    #field intptr pbClientDataJSON
    #field int cbRegistrationResponseJSON
    #field intptr pbRegistrationResponseJSON
#endstruct

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