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対称暗号アルゴリズム識別子を保持するワイド文字列(CNGアルゴリズム名)。
ChainingModeWCHAR128+128+128ブロック暗号の連鎖モードを示すワイド文字列(GCM/CBC等)。
HashAlgIdWCHAR128+256+256鍵導出に用いるハッシュアルゴリズム識別子を保持するワイド文字列。
KeySizeWORD2+384+384トラフィック鍵のサイズ(バイト数)。
IvSizeWORD2+386+386初期化ベクトルのサイズ(バイト数)。
MsgSequenceStartWORD2+388+388本シークレットが有効となる開始メッセージ番号。
MsgSequenceEndWORD2+390+390本シークレットが有効となる終了メッセージ番号。
TrafficSecretTypeSEC_TRAFFIC_SECRET_TYPE4+392+392トラフィックシークレットの種別を示すSEC_TRAFFIC_SECRET_TYPE列挙値。
TrafficSecretSizeWORD2+396+396TrafficSecretの長さ(バイト数)。
TrafficSecretBYTE1+398+398実際のトラフィックシークレットデータを保持する可変長バイト配列の先頭要素。

各言語での定義

#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