Win32 API 日本語リファレンス
ホームSecurity.Cryptography › RECIPIENTPOLICY

RECIPIENTPOLICY

構造体
サイズx64: 120 バイト / x86: 60 バイト

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

フィールド

フィールドサイズx64x86説明
recipientENDPOINTADDRESS32/16+0+0トークン受信者のエンドポイントアドレス。
issuerENDPOINTADDRESS32/16+32+16トークン発行者のエンドポイントアドレス。
tokenTypeLPWSTR8/4+64+32要求するトークンの種別を示すワイド文字列。
requiredClaimsCLAIMLIST16/8+72+36必須クレームのリスト。
optionalClaimsCLAIMLIST16/8+88+44任意クレームのリスト。
privacyUrlLPWSTR8/4+104+52プライバシーポリシーのURLを示すワイド文字列。NULL可。
privacyVersionDWORD4+112+56プライバシーポリシーのバージョン番号。

各言語での定義

#include <windows.h>

// CRYPT_INTEGER_BLOB  (x64 16 / x86 8 バイト)
typedef struct CRYPT_INTEGER_BLOB {
    DWORD cbData;
    BYTE* pbData;
} CRYPT_INTEGER_BLOB;

// ENDPOINTADDRESS  (x64 32 / x86 16 バイト)
typedef struct ENDPOINTADDRESS {
    LPWSTR serviceUrl;
    LPWSTR policyUrl;
    CRYPT_INTEGER_BLOB rawCertificate;
} ENDPOINTADDRESS;

// CLAIMLIST  (x64 16 / x86 8 バイト)
typedef struct CLAIMLIST {
    DWORD count;
    LPWSTR* claims;
} CLAIMLIST;

// RECIPIENTPOLICY  (x64 120 / x86 60 バイト)
typedef struct RECIPIENTPOLICY {
    ENDPOINTADDRESS recipient;
    ENDPOINTADDRESS issuer;
    LPWSTR tokenType;
    CLAIMLIST requiredClaims;
    CLAIMLIST optionalClaims;
    LPWSTR privacyUrl;
    DWORD privacyVersion;
} RECIPIENTPOLICY;
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 ENDPOINTADDRESS
{
    public IntPtr serviceUrl;
    public IntPtr policyUrl;
    public CRYPT_INTEGER_BLOB rawCertificate;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CLAIMLIST
{
    public uint count;
    public IntPtr claims;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RECIPIENTPOLICY
{
    public ENDPOINTADDRESS recipient;
    public ENDPOINTADDRESS issuer;
    public IntPtr tokenType;
    public CLAIMLIST requiredClaims;
    public CLAIMLIST optionalClaims;
    public IntPtr privacyUrl;
    public uint privacyVersion;
}
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 ENDPOINTADDRESS
    Public serviceUrl As IntPtr
    Public policyUrl As IntPtr
    Public rawCertificate As CRYPT_INTEGER_BLOB
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CLAIMLIST
    Public count As UInteger
    Public claims As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RECIPIENTPOLICY
    Public recipient As ENDPOINTADDRESS
    Public issuer As ENDPOINTADDRESS
    Public tokenType As IntPtr
    Public requiredClaims As CLAIMLIST
    Public optionalClaims As CLAIMLIST
    Public privacyUrl As IntPtr
    Public privacyVersion As UInteger
End Structure
import ctypes
from ctypes import wintypes

class CRYPT_INTEGER_BLOB(ctypes.Structure):
    _fields_ = [
        ("cbData", wintypes.DWORD),
        ("pbData", ctypes.c_void_p),
    ]

class ENDPOINTADDRESS(ctypes.Structure):
    _fields_ = [
        ("serviceUrl", ctypes.c_void_p),
        ("policyUrl", ctypes.c_void_p),
        ("rawCertificate", CRYPT_INTEGER_BLOB),
    ]

class CLAIMLIST(ctypes.Structure):
    _fields_ = [
        ("count", wintypes.DWORD),
        ("claims", ctypes.c_void_p),
    ]

class RECIPIENTPOLICY(ctypes.Structure):
    _fields_ = [
        ("recipient", ENDPOINTADDRESS),
        ("issuer", ENDPOINTADDRESS),
        ("tokenType", ctypes.c_void_p),
        ("requiredClaims", CLAIMLIST),
        ("optionalClaims", CLAIMLIST),
        ("privacyUrl", ctypes.c_void_p),
        ("privacyVersion", wintypes.DWORD),
    ]
#[repr(C)]
pub struct CRYPT_INTEGER_BLOB {
    pub cbData: u32,
    pub pbData: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct ENDPOINTADDRESS {
    pub serviceUrl: *mut core::ffi::c_void,
    pub policyUrl: *mut core::ffi::c_void,
    pub rawCertificate: CRYPT_INTEGER_BLOB,
}

#[repr(C)]
pub struct CLAIMLIST {
    pub count: u32,
    pub claims: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct RECIPIENTPOLICY {
    pub recipient: ENDPOINTADDRESS,
    pub issuer: ENDPOINTADDRESS,
    pub tokenType: *mut core::ffi::c_void,
    pub requiredClaims: CLAIMLIST,
    pub optionalClaims: CLAIMLIST,
    pub privacyUrl: *mut core::ffi::c_void,
    pub privacyVersion: u32,
}
import "golang.org/x/sys/windows"

type CRYPT_INTEGER_BLOB struct {
	cbData uint32
	pbData uintptr
}

type ENDPOINTADDRESS struct {
	serviceUrl uintptr
	policyUrl uintptr
	rawCertificate CRYPT_INTEGER_BLOB
}

type CLAIMLIST struct {
	count uint32
	claims uintptr
}

type RECIPIENTPOLICY struct {
	recipient ENDPOINTADDRESS
	issuer ENDPOINTADDRESS
	tokenType uintptr
	requiredClaims CLAIMLIST
	optionalClaims CLAIMLIST
	privacyUrl uintptr
	privacyVersion uint32
}
type
  CRYPT_INTEGER_BLOB = record
    cbData: DWORD;
    pbData: Pointer;
  end;

  ENDPOINTADDRESS = record
    serviceUrl: Pointer;
    policyUrl: Pointer;
    rawCertificate: CRYPT_INTEGER_BLOB;
  end;

  CLAIMLIST = record
    count: DWORD;
    claims: Pointer;
  end;

  RECIPIENTPOLICY = record
    recipient: ENDPOINTADDRESS;
    issuer: ENDPOINTADDRESS;
    tokenType: Pointer;
    requiredClaims: CLAIMLIST;
    optionalClaims: CLAIMLIST;
    privacyUrl: Pointer;
    privacyVersion: DWORD;
  end;
const CRYPT_INTEGER_BLOB = extern struct {
    cbData: u32,
    pbData: ?*anyopaque,
};

const ENDPOINTADDRESS = extern struct {
    serviceUrl: ?*anyopaque,
    policyUrl: ?*anyopaque,
    rawCertificate: CRYPT_INTEGER_BLOB,
};

const CLAIMLIST = extern struct {
    count: u32,
    claims: ?*anyopaque,
};

const RECIPIENTPOLICY = extern struct {
    recipient: ENDPOINTADDRESS,
    issuer: ENDPOINTADDRESS,
    tokenType: ?*anyopaque,
    requiredClaims: CLAIMLIST,
    optionalClaims: CLAIMLIST,
    privacyUrl: ?*anyopaque,
    privacyVersion: u32,
};
type
  CRYPT_INTEGER_BLOB {.bycopy.} = object
    cbData: uint32
    pbData: pointer

  ENDPOINTADDRESS {.bycopy.} = object
    serviceUrl: pointer
    policyUrl: pointer
    rawCertificate: CRYPT_INTEGER_BLOB

  CLAIMLIST {.bycopy.} = object
    count: uint32
    claims: pointer

  RECIPIENTPOLICY {.bycopy.} = object
    recipient: ENDPOINTADDRESS
    issuer: ENDPOINTADDRESS
    tokenType: pointer
    requiredClaims: CLAIMLIST
    optionalClaims: CLAIMLIST
    privacyUrl: pointer
    privacyVersion: uint32
struct CRYPT_INTEGER_BLOB
{
    uint cbData;
    void* pbData;
}

struct ENDPOINTADDRESS
{
    void* serviceUrl;
    void* policyUrl;
    CRYPT_INTEGER_BLOB rawCertificate;
}

struct CLAIMLIST
{
    uint count;
    void* claims;
}

struct RECIPIENTPOLICY
{
    ENDPOINTADDRESS recipient;
    ENDPOINTADDRESS issuer;
    void* tokenType;
    CLAIMLIST requiredClaims;
    CLAIMLIST optionalClaims;
    void* privacyUrl;
    uint privacyVersion;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RECIPIENTPOLICY サイズ: 60 バイト(x86)
dim st, 15    ; 4byte整数×15(構造体サイズ 60 / 4 切り上げ)
; recipient : ENDPOINTADDRESS (+0, 16byte)  varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; issuer : ENDPOINTADDRESS (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; tokenType : LPWSTR (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; requiredClaims : CLAIMLIST (+36, 8byte)  varptr(st)+36 を基点に操作(8byte:入れ子/配列)
; optionalClaims : CLAIMLIST (+44, 8byte)  varptr(st)+44 を基点に操作(8byte:入れ子/配列)
; privacyUrl : LPWSTR (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; privacyVersion : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RECIPIENTPOLICY サイズ: 120 バイト(x64)
dim st, 30    ; 4byte整数×30(構造体サイズ 120 / 4 切り上げ)
; recipient : ENDPOINTADDRESS (+0, 32byte)  varptr(st)+0 を基点に操作(32byte:入れ子/配列)
; issuer : ENDPOINTADDRESS (+32, 32byte)  varptr(st)+32 を基点に操作(32byte:入れ子/配列)
; tokenType : LPWSTR (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; requiredClaims : CLAIMLIST (+72, 16byte)  varptr(st)+72 を基点に操作(16byte:入れ子/配列)
; optionalClaims : CLAIMLIST (+88, 16byte)  varptr(st)+88 を基点に操作(16byte:入れ子/配列)
; privacyUrl : LPWSTR (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; privacyVersion : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; ※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 ENDPOINTADDRESS
    #field intptr serviceUrl
    #field intptr policyUrl
    #field CRYPT_INTEGER_BLOB rawCertificate
#endstruct

#defstruct global CLAIMLIST
    #field int count
    #field intptr claims
#endstruct

#defstruct global RECIPIENTPOLICY
    #field ENDPOINTADDRESS recipient
    #field ENDPOINTADDRESS issuer
    #field intptr tokenType
    #field CLAIMLIST requiredClaims
    #field CLAIMLIST optionalClaims
    #field intptr privacyUrl
    #field int privacyVersion
#endstruct

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