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

SEC_TRAFFIC_SECRETS

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

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

フィールド

フィールドサイズx64x86説明
SymmetricAlgIdWCHAR128+0+0ネゴシエートされた対称鍵アルゴリズム(例: BCRYPT_AES_ALGORITHM)。
ChainingModeWCHAR128+128+128ネゴシエートされた対称鍵アルゴリズムのチェーン モード(例: BCRYPT_CHAIN_MODE_GCM または BCRYPT_CHAIN_MODE_CCM)。
HashAlgIdWCHAR128+256+256ネゴシエートされたハッシュ アルゴリズム(例: BCRYPT_SHA256_ALGORITHM または BCRYPT_SHA384_ALGORITHM)。
KeySizeWORD2+384+384このトラフィック シークレットから導出する対称鍵のサイズ(バイト単位)。
IvSizeWORD2+386+386このトラフィック シークレットから導出する IV のサイズ(バイト単位)。
MsgSequenceStartWORD2+388+388TrafficSecret から導出された鍵で保護される TLS メッセージ シーケンスの最初のバイトのオフセット。バッファーの最初のバイトを示すには 0 を使用します。
MsgSequenceEndWORD2+390+390TrafficSecret から導出された鍵で保護される TLS メッセージ シーケンスの最後のバイトのオフセット。シークレットがアプリケーション データの暗号化または受信レコードの復号に使用される場合は 0 を使用します。
TrafficSecretTypeSEC_TRAFFIC_SECRET_TYPE4+392+392TRAFFIC_SECRET_TYPE 列挙型で示されるトラフィック シークレットの種類。
TrafficSecretSizeWORD2+396+396トラフィック シークレットのサイズ(バイト単位)。
TrafficSecretBYTE1+398+398TrafficSecretType で示される種類の、長さ TrafficSecretSize バイトのトラフィック シークレット。メッセージ保護用の書き込み鍵と IV の導出に使用されます。

公式ドキュメント

接続のトラフィック シークレットを格納します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// SEC_TRAFFIC_SECRETS  (x64 400 / x86 400 バイト)
typedef struct SEC_TRAFFIC_SECRETS {
    WCHAR SymmetricAlgId[64];
    WCHAR ChainingMode[64];
    WCHAR HashAlgId[64];
    WORD KeySize;
    WORD IvSize;
    WORD MsgSequenceStart;
    WORD MsgSequenceEnd;
    SEC_TRAFFIC_SECRET_TYPE TrafficSecretType;
    WORD TrafficSecretSize;
    BYTE TrafficSecret[1];
} SEC_TRAFFIC_SECRETS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SEC_TRAFFIC_SECRETS
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string SymmetricAlgId;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string ChainingMode;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string HashAlgId;
    public ushort KeySize;
    public ushort IvSize;
    public ushort MsgSequenceStart;
    public ushort MsgSequenceEnd;
    public int TrafficSecretType;
    public ushort TrafficSecretSize;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public byte[] TrafficSecret;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SEC_TRAFFIC_SECRETS
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=64)> Public SymmetricAlgId As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=64)> Public ChainingMode As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=64)> Public HashAlgId As String
    Public KeySize As UShort
    Public IvSize As UShort
    Public MsgSequenceStart As UShort
    Public MsgSequenceEnd As UShort
    Public TrafficSecretType As Integer
    Public TrafficSecretSize As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public TrafficSecret() As Byte
End Structure
import ctypes
from ctypes import wintypes

class SEC_TRAFFIC_SECRETS(ctypes.Structure):
    _fields_ = [
        ("SymmetricAlgId", ctypes.c_wchar * 64),
        ("ChainingMode", ctypes.c_wchar * 64),
        ("HashAlgId", ctypes.c_wchar * 64),
        ("KeySize", ctypes.c_ushort),
        ("IvSize", ctypes.c_ushort),
        ("MsgSequenceStart", ctypes.c_ushort),
        ("MsgSequenceEnd", ctypes.c_ushort),
        ("TrafficSecretType", ctypes.c_int),
        ("TrafficSecretSize", ctypes.c_ushort),
        ("TrafficSecret", ctypes.c_ubyte * 1),
    ]
#[repr(C)]
pub struct SEC_TRAFFIC_SECRETS {
    pub SymmetricAlgId: [u16; 64],
    pub ChainingMode: [u16; 64],
    pub HashAlgId: [u16; 64],
    pub KeySize: u16,
    pub IvSize: u16,
    pub MsgSequenceStart: u16,
    pub MsgSequenceEnd: u16,
    pub TrafficSecretType: i32,
    pub TrafficSecretSize: u16,
    pub TrafficSecret: [u8; 1],
}
import "golang.org/x/sys/windows"

type SEC_TRAFFIC_SECRETS struct {
	SymmetricAlgId [64]uint16
	ChainingMode [64]uint16
	HashAlgId [64]uint16
	KeySize uint16
	IvSize uint16
	MsgSequenceStart uint16
	MsgSequenceEnd uint16
	TrafficSecretType int32
	TrafficSecretSize uint16
	TrafficSecret [1]byte
}
type
  SEC_TRAFFIC_SECRETS = record
    SymmetricAlgId: array[0..63] of WideChar;
    ChainingMode: array[0..63] of WideChar;
    HashAlgId: array[0..63] of WideChar;
    KeySize: Word;
    IvSize: Word;
    MsgSequenceStart: Word;
    MsgSequenceEnd: Word;
    TrafficSecretType: Integer;
    TrafficSecretSize: Word;
    TrafficSecret: array[0..0] of Byte;
  end;
const SEC_TRAFFIC_SECRETS = extern struct {
    SymmetricAlgId: [64]u16,
    ChainingMode: [64]u16,
    HashAlgId: [64]u16,
    KeySize: u16,
    IvSize: u16,
    MsgSequenceStart: u16,
    MsgSequenceEnd: u16,
    TrafficSecretType: i32,
    TrafficSecretSize: u16,
    TrafficSecret: [1]u8,
};
type
  SEC_TRAFFIC_SECRETS {.bycopy.} = object
    SymmetricAlgId: array[64, uint16]
    ChainingMode: array[64, uint16]
    HashAlgId: array[64, uint16]
    KeySize: uint16
    IvSize: uint16
    MsgSequenceStart: uint16
    MsgSequenceEnd: uint16
    TrafficSecretType: int32
    TrafficSecretSize: uint16
    TrafficSecret: array[1, uint8]
struct SEC_TRAFFIC_SECRETS
{
    wchar[64] SymmetricAlgId;
    wchar[64] ChainingMode;
    wchar[64] HashAlgId;
    ushort KeySize;
    ushort IvSize;
    ushort MsgSequenceStart;
    ushort MsgSequenceEnd;
    int TrafficSecretType;
    ushort TrafficSecretSize;
    ubyte[1] TrafficSecret;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SEC_TRAFFIC_SECRETS サイズ: 400 バイト(x64)
dim st, 100    ; 4byte整数×100(構造体サイズ 400 / 4 切り上げ)
; SymmetricAlgId : WCHAR (+0, 128byte)  varptr(st)+0 を基点に操作(128byte:入れ子/配列)
; ChainingMode : WCHAR (+128, 128byte)  varptr(st)+128 を基点に操作(128byte:入れ子/配列)
; HashAlgId : WCHAR (+256, 128byte)  varptr(st)+256 を基点に操作(128byte:入れ子/配列)
; KeySize : WORD (+384, 2byte)  wpoke st,384,値  /  値 = wpeek(st,384)
; IvSize : WORD (+386, 2byte)  wpoke st,386,値  /  値 = wpeek(st,386)
; MsgSequenceStart : WORD (+388, 2byte)  wpoke st,388,値  /  値 = wpeek(st,388)
; MsgSequenceEnd : WORD (+390, 2byte)  wpoke st,390,値  /  値 = wpeek(st,390)
; TrafficSecretType : SEC_TRAFFIC_SECRET_TYPE (+392, 4byte)  st.98 = 値  /  値 = st.98   (lpoke/lpeek も可)
; TrafficSecretSize : WORD (+396, 2byte)  wpoke st,396,値  /  値 = wpeek(st,396)
; TrafficSecret : BYTE (+398, 1byte)  varptr(st)+398 を基点に操作(1byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SEC_TRAFFIC_SECRETS
    #field wchar SymmetricAlgId 64
    #field wchar ChainingMode 64
    #field wchar HashAlgId 64
    #field short KeySize
    #field short IvSize
    #field short MsgSequenceStart
    #field short MsgSequenceEnd
    #field int TrafficSecretType
    #field short TrafficSecretSize
    #field byte TrafficSecret 1
#endstruct

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