CryptMsgOpenToDecode
関数シグネチャ
// CRYPT32.dll
#include <windows.h>
void* CryptMsgOpenToDecode(
DWORD dwMsgEncodingType,
DWORD dwFlags,
DWORD dwMsgType,
HCRYPTPROV_LEGACY hCryptProv, // optional
CERT_INFO* pRecipientInfo, // optional
CMSG_STREAM_INFO* pStreamInfo // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwMsgEncodingType | DWORD | in | 使用するエンコード種別を指定します。次の例のように、証明書エンコード種別とメッセージエンコード種別をビットごとのOR演算で組み合わせて両方を指定することも常に可能です。 X509_ASN_ENCODING | PKCS_7_ASN_ENCODING 現在定義されているエンコード種別は次のとおりです。 | ||||||||||||
| dwFlags | DWORD | in | このパラメーターには、次のフラグのいずれかを指定できます。
| ||||||||||||
| dwMsgType | DWORD | in | デコードするメッセージの種類を指定します。ほとんどの場合、メッセージの種類はメッセージヘッダーから判別されるため、このパラメーターには 0 を渡します。特に Internet Explorer 3.0 では、メッセージにヘッダーがない場合があり、その場合はデコードするメッセージの種類をこの関数呼び出しで指定する必要があります。ヘッダーが存在せず、このパラメーターに 0 を渡した場合、関数は失敗します。 このパラメーターには、次の定義済みメッセージ種別のいずれかを指定できます。
| ||||||||||||
| hCryptProv | HCRYPTPROV_LEGACY | inoptional | このパラメーターは使用されないため、NULL に設定してください。 Windows Server 2003 および Windows XP: メッセージのハッシュ処理に使用する暗号化プロバイダーのハンドルを指定します。署名されたメッセージの場合、hCryptProv は署名の検証に使用されます。このパラメーターのデータ型は HCRYPTPROV です。 特定の暗号化プロバイダーを hCryptProv に渡す強い理由がない限り、このパラメーターは NULL に設定してください。NULL を渡すと、ハッシュ、署名検証、または受信者暗号化の各操作を実行する前に、既定の RSA または DSS プロバイダーが取得されます。 | ||||||||||||
| pRecipientInfo | CERT_INFO* | optional | このパラメーターは将来の使用のために予約されており、NULL でなければなりません。 | ||||||||||||
| pStreamInfo | CMSG_STREAM_INFO* | inoptional | ストリーミングを使用しない場合、このパラメーターは NULL に設定する必要があります。 メモ ストリーミングは CMSG_HASHED メッセージでは使用されません。ハッシュ化されたデータを扱う場合、このパラメーターは NULL に設定する必要があります。
ストリーミングを使用する場合、pStreamInfo パラメーターは CMSG_STREAM_INFO 構造体へのポインターであり、この構造体には、CryptMsgUpdate の実行時、またはストリーミングされたエンベロープ化メッセージのデコード時に CryptMsgControl が実行されたときに呼び出されるコールバックへのポインターが含まれます。 署名されたメッセージの場合、コールバックにはメッセージの内部コンテンツからデコードされたバイトのブロックが渡されます。 エンベロープ化されたメッセージの場合、CryptMsgUpdate の各呼び出しの後に、CryptMsgGetParam 関数を呼び出して CMSG_ENVELOPE_ALGORITHM_PARAM プロパティが利用可能かどうかを確認する必要があります。CryptMsgUpdate が CMSG_ENVELOPE_ALGORITHM_PARAM プロパティを利用可能にするのに十分な量のメッセージを処理するまで、CryptMsgGetParam は失敗し、GetLastError は CRYPT_E_STREAM_MSG_NOT_READY を返します。CMSG_ENVELOPE_ALGORITHM_PARAM プロパティが利用可能になると、CryptMsgGetParam 関数を使用して CMSG_RECIPIENT_INFO_PARAM プロパティを取得することにより、受信者を反復処理して各受信者の CERT_INFO 構造体を取得できます。人為的に大きなヘッダーブロックを持つエンベロープ化メッセージによるサービス拒否攻撃を防ぐため、この処理中に CryptMsgUpdate 関数に渡されたメモリ量を追跡する必要があります。CMSG_ENVELOPE_ALGORITHM_PARAM プロパティが利用可能になる前にデータ量がアプリケーションで定義した上限を超えた場合は、メッセージの処理を停止し、CryptMsgClose 関数を呼び出して、メッセージのために割り当てられたメモリをオペレーティングシステムに解放させる必要があります。推奨される上限はメッセージの最大許容サイズです。たとえば、メッセージの最大サイズが 10 MB の場合、このテストの上限は 10 MB にする必要があります。 CERT_INFO 構造体は、CertGetSubjectCertificateFromStore 関数を使用して、あらかじめ開いておいた証明書ストア内で一致する証明書を見つけるために使用されます。正しい証明書が見つかると、CERT_KEY_PROV_INFO_PROP_ID パラメーターを指定して CertGetCertificateContextProperty 関数を呼び出し、CRYPT_KEY_PROV_INFO 構造体を取得します。この構造体には、CRYPT_KEY_PROV_INFO 構造体の pwszContainerName、pwszProvName、dwProvType、dwFlags の各メンバーを使用して CryptAcquireContext を呼び出すことで受信者の秘密キーを取得するために必要な情報が含まれています。取得した hCryptProv と CRYPT_KEY_PROV_INFO 構造体の dwKeySpec メンバーは、CMSG_CTRL_DECRYPT_PARA 構造体のメンバーとして CryptMsgControl 構造体に渡され、内部コンテンツの復号を開始できるようにします。その後、ストリーミングコードはデータが入力されるにつれて復号を実行します。生成されたプレーンテキストのブロックは、CMSG_STREAM_INFO 構造体の pfnStreamOutput メンバーで指定されたコールバック関数に渡され、復号されたメッセージの出力を処理します。 メモ エンベロープ化メッセージのストリーミングデコードでは、復号を開始するために CryptMsgControl が呼び出されるまで、暗号文がメモリ内にキューイングされます。蓄積された暗号文が大きくなりすぎてシステムのメモリが不足する前にデータをディスクに保存したり他の場所へ転送したりできるよう、アプリケーションは速やかに復号を開始する必要があります。
エンベロープ化メッセージ内に署名されたメッセージが格納されている場合、エンベロープ化メッセージのストリーミングデコードから出力されたプレーンテキストを別のストリーミングデコードに入力して、署名されたメッセージを処理できます。 |
戻り値の型: void*
公式ドキュメント
暗号化メッセージをデコード用に開き、開いたメッセージのハンドルを返します。
戻り値
関数が成功した場合、開いたメッセージのハンドルを返します。
関数が失敗した場合は NULL を返します。拡張エラー情報を取得するには、 GetLastError を呼び出します。
次の表に、GetLastError 関数によって最も一般的に返されるエラーコードを示します。
| 値 | 説明 |
|---|---|
| 1 つ以上の引数が無効です。 | |
| メモリの割り当てに失敗しました。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// CRYPT32.dll
#include <windows.h>
void* CryptMsgOpenToDecode(
DWORD dwMsgEncodingType,
DWORD dwFlags,
DWORD dwMsgType,
HCRYPTPROV_LEGACY hCryptProv, // optional
CERT_INFO* pRecipientInfo, // optional
CMSG_STREAM_INFO* pStreamInfo // optional
);[DllImport("CRYPT32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr CryptMsgOpenToDecode(
uint dwMsgEncodingType, // DWORD
uint dwFlags, // DWORD
uint dwMsgType, // DWORD
UIntPtr hCryptProv, // HCRYPTPROV_LEGACY optional
IntPtr pRecipientInfo, // CERT_INFO* optional
IntPtr pStreamInfo // CMSG_STREAM_INFO* optional
);<DllImport("CRYPT32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CryptMsgOpenToDecode(
dwMsgEncodingType As UInteger, ' DWORD
dwFlags As UInteger, ' DWORD
dwMsgType As UInteger, ' DWORD
hCryptProv As UIntPtr, ' HCRYPTPROV_LEGACY optional
pRecipientInfo As IntPtr, ' CERT_INFO* optional
pStreamInfo As IntPtr ' CMSG_STREAM_INFO* optional
) As IntPtr
End Function' dwMsgEncodingType : DWORD
' dwFlags : DWORD
' dwMsgType : DWORD
' hCryptProv : HCRYPTPROV_LEGACY optional
' pRecipientInfo : CERT_INFO* optional
' pStreamInfo : CMSG_STREAM_INFO* optional
Declare PtrSafe Function CryptMsgOpenToDecode Lib "crypt32" ( _
ByVal dwMsgEncodingType As Long, _
ByVal dwFlags As Long, _
ByVal dwMsgType As Long, _
ByVal hCryptProv As LongPtr, _
ByVal pRecipientInfo As LongPtr, _
ByVal pStreamInfo As LongPtr) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
CryptMsgOpenToDecode = ctypes.windll.crypt32.CryptMsgOpenToDecode
CryptMsgOpenToDecode.restype = ctypes.c_void_p
CryptMsgOpenToDecode.argtypes = [
wintypes.DWORD, # dwMsgEncodingType : DWORD
wintypes.DWORD, # dwFlags : DWORD
wintypes.DWORD, # dwMsgType : DWORD
ctypes.c_size_t, # hCryptProv : HCRYPTPROV_LEGACY optional
ctypes.c_void_p, # pRecipientInfo : CERT_INFO* optional
ctypes.c_void_p, # pStreamInfo : CMSG_STREAM_INFO* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('CRYPT32.dll')
CryptMsgOpenToDecode = Fiddle::Function.new(
lib['CryptMsgOpenToDecode'],
[
-Fiddle::TYPE_INT, # dwMsgEncodingType : DWORD
-Fiddle::TYPE_INT, # dwFlags : DWORD
-Fiddle::TYPE_INT, # dwMsgType : DWORD
Fiddle::TYPE_UINTPTR_T, # hCryptProv : HCRYPTPROV_LEGACY optional
Fiddle::TYPE_VOIDP, # pRecipientInfo : CERT_INFO* optional
Fiddle::TYPE_VOIDP, # pStreamInfo : CMSG_STREAM_INFO* optional
],
Fiddle::TYPE_VOIDP)#[link(name = "crypt32")]
extern "system" {
fn CryptMsgOpenToDecode(
dwMsgEncodingType: u32, // DWORD
dwFlags: u32, // DWORD
dwMsgType: u32, // DWORD
hCryptProv: usize, // HCRYPTPROV_LEGACY optional
pRecipientInfo: *mut CERT_INFO, // CERT_INFO* optional
pStreamInfo: *mut CMSG_STREAM_INFO // CMSG_STREAM_INFO* optional
) -> *mut ();
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("CRYPT32.dll", SetLastError = true)]
public static extern IntPtr CryptMsgOpenToDecode(uint dwMsgEncodingType, uint dwFlags, uint dwMsgType, UIntPtr hCryptProv, IntPtr pRecipientInfo, IntPtr pStreamInfo);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CryptMsgOpenToDecode' -Namespace Win32 -PassThru
# $api::CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)#uselib "CRYPT32.dll"
#func global CryptMsgOpenToDecode "CryptMsgOpenToDecode" sptr, sptr, sptr, sptr, sptr, sptr
; CryptMsgOpenToDecode dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, varptr(pRecipientInfo), varptr(pStreamInfo) ; 戻り値は stat
; dwMsgEncodingType : DWORD -> "sptr"
; dwFlags : DWORD -> "sptr"
; dwMsgType : DWORD -> "sptr"
; hCryptProv : HCRYPTPROV_LEGACY optional -> "sptr"
; pRecipientInfo : CERT_INFO* optional -> "sptr"
; pStreamInfo : CMSG_STREAM_INFO* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "CRYPT32.dll" #cfunc global CryptMsgOpenToDecode "CryptMsgOpenToDecode" int, int, int, sptr, var, var ; res = CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo) ; dwMsgEncodingType : DWORD -> "int" ; dwFlags : DWORD -> "int" ; dwMsgType : DWORD -> "int" ; hCryptProv : HCRYPTPROV_LEGACY optional -> "sptr" ; pRecipientInfo : CERT_INFO* optional -> "var" ; pStreamInfo : CMSG_STREAM_INFO* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "CRYPT32.dll" #cfunc global CryptMsgOpenToDecode "CryptMsgOpenToDecode" int, int, int, sptr, sptr, sptr ; res = CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, varptr(pRecipientInfo), varptr(pStreamInfo)) ; dwMsgEncodingType : DWORD -> "int" ; dwFlags : DWORD -> "int" ; dwMsgType : DWORD -> "int" ; hCryptProv : HCRYPTPROV_LEGACY optional -> "sptr" ; pRecipientInfo : CERT_INFO* optional -> "sptr" ; pStreamInfo : CMSG_STREAM_INFO* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; void* CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, HCRYPTPROV_LEGACY hCryptProv, CERT_INFO* pRecipientInfo, CMSG_STREAM_INFO* pStreamInfo) #uselib "CRYPT32.dll" #cfunc global CryptMsgOpenToDecode "CryptMsgOpenToDecode" int, int, int, intptr, var, var ; res = CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo) ; dwMsgEncodingType : DWORD -> "int" ; dwFlags : DWORD -> "int" ; dwMsgType : DWORD -> "int" ; hCryptProv : HCRYPTPROV_LEGACY optional -> "intptr" ; pRecipientInfo : CERT_INFO* optional -> "var" ; pStreamInfo : CMSG_STREAM_INFO* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; void* CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, HCRYPTPROV_LEGACY hCryptProv, CERT_INFO* pRecipientInfo, CMSG_STREAM_INFO* pStreamInfo) #uselib "CRYPT32.dll" #cfunc global CryptMsgOpenToDecode "CryptMsgOpenToDecode" int, int, int, intptr, intptr, intptr ; res = CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, varptr(pRecipientInfo), varptr(pStreamInfo)) ; dwMsgEncodingType : DWORD -> "int" ; dwFlags : DWORD -> "int" ; dwMsgType : DWORD -> "int" ; hCryptProv : HCRYPTPROV_LEGACY optional -> "intptr" ; pRecipientInfo : CERT_INFO* optional -> "intptr" ; pStreamInfo : CMSG_STREAM_INFO* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
procCryptMsgOpenToDecode = crypt32.NewProc("CryptMsgOpenToDecode")
)
// dwMsgEncodingType (DWORD), dwFlags (DWORD), dwMsgType (DWORD), hCryptProv (HCRYPTPROV_LEGACY optional), pRecipientInfo (CERT_INFO* optional), pStreamInfo (CMSG_STREAM_INFO* optional)
r1, _, err := procCryptMsgOpenToDecode.Call(
uintptr(dwMsgEncodingType),
uintptr(dwFlags),
uintptr(dwMsgType),
uintptr(hCryptProv),
uintptr(pRecipientInfo),
uintptr(pStreamInfo),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // void*function CryptMsgOpenToDecode(
dwMsgEncodingType: DWORD; // DWORD
dwFlags: DWORD; // DWORD
dwMsgType: DWORD; // DWORD
hCryptProv: NativeUInt; // HCRYPTPROV_LEGACY optional
pRecipientInfo: Pointer; // CERT_INFO* optional
pStreamInfo: Pointer // CMSG_STREAM_INFO* optional
): Pointer; stdcall;
external 'CRYPT32.dll' name 'CryptMsgOpenToDecode';result := DllCall("CRYPT32\CryptMsgOpenToDecode"
, "UInt", dwMsgEncodingType ; DWORD
, "UInt", dwFlags ; DWORD
, "UInt", dwMsgType ; DWORD
, "UPtr", hCryptProv ; HCRYPTPROV_LEGACY optional
, "Ptr", pRecipientInfo ; CERT_INFO* optional
, "Ptr", pStreamInfo ; CMSG_STREAM_INFO* optional
, "Ptr") ; return: void*●CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo) = DLL("CRYPT32.dll", "void* CryptMsgOpenToDecode(dword, dword, dword, int, void*, void*)")
# 呼び出し: CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)
# dwMsgEncodingType : DWORD -> "dword"
# dwFlags : DWORD -> "dword"
# dwMsgType : DWORD -> "dword"
# hCryptProv : HCRYPTPROV_LEGACY optional -> "int"
# pRecipientInfo : CERT_INFO* optional -> "void*"
# pStreamInfo : CMSG_STREAM_INFO* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "crypt32" fn CryptMsgOpenToDecode(
dwMsgEncodingType: u32, // DWORD
dwFlags: u32, // DWORD
dwMsgType: u32, // DWORD
hCryptProv: usize, // HCRYPTPROV_LEGACY optional
pRecipientInfo: [*c]CERT_INFO, // CERT_INFO* optional
pStreamInfo: [*c]CMSG_STREAM_INFO // CMSG_STREAM_INFO* optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;proc CryptMsgOpenToDecode(
dwMsgEncodingType: uint32, # DWORD
dwFlags: uint32, # DWORD
dwMsgType: uint32, # DWORD
hCryptProv: uint, # HCRYPTPROV_LEGACY optional
pRecipientInfo: ptr CERT_INFO, # CERT_INFO* optional
pStreamInfo: ptr CMSG_STREAM_INFO # CMSG_STREAM_INFO* optional
): pointer {.importc: "CryptMsgOpenToDecode", stdcall, dynlib: "CRYPT32.dll".}pragma(lib, "crypt32");
extern(Windows)
void* CryptMsgOpenToDecode(
uint dwMsgEncodingType, // DWORD
uint dwFlags, // DWORD
uint dwMsgType, // DWORD
size_t hCryptProv, // HCRYPTPROV_LEGACY optional
CERT_INFO* pRecipientInfo, // CERT_INFO* optional
CMSG_STREAM_INFO* pStreamInfo // CMSG_STREAM_INFO* optional
);ccall((:CryptMsgOpenToDecode, "CRYPT32.dll"), stdcall, Ptr{Cvoid},
(UInt32, UInt32, UInt32, Csize_t, Ptr{CERT_INFO}, Ptr{CMSG_STREAM_INFO}),
dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)
# dwMsgEncodingType : DWORD -> UInt32
# dwFlags : DWORD -> UInt32
# dwMsgType : DWORD -> UInt32
# hCryptProv : HCRYPTPROV_LEGACY optional -> Csize_t
# pRecipientInfo : CERT_INFO* optional -> Ptr{CERT_INFO}
# pStreamInfo : CMSG_STREAM_INFO* optional -> Ptr{CMSG_STREAM_INFO}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
void* CryptMsgOpenToDecode(
uint32_t dwMsgEncodingType,
uint32_t dwFlags,
uint32_t dwMsgType,
uintptr_t hCryptProv,
void* pRecipientInfo,
void* pStreamInfo);
]]
local crypt32 = ffi.load("crypt32")
-- crypt32.CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)
-- dwMsgEncodingType : DWORD
-- dwFlags : DWORD
-- dwMsgType : DWORD
-- hCryptProv : HCRYPTPROV_LEGACY optional
-- pRecipientInfo : CERT_INFO* optional
-- pStreamInfo : CMSG_STREAM_INFO* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('CRYPT32.dll');
const CryptMsgOpenToDecode = lib.func('__stdcall', 'CryptMsgOpenToDecode', 'void *', ['uint32_t', 'uint32_t', 'uint32_t', 'uintptr_t', 'void *', 'void *']);
// CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)
// dwMsgEncodingType : DWORD -> 'uint32_t'
// dwFlags : DWORD -> 'uint32_t'
// dwMsgType : DWORD -> 'uint32_t'
// hCryptProv : HCRYPTPROV_LEGACY optional -> 'uintptr_t'
// pRecipientInfo : CERT_INFO* optional -> 'void *'
// pStreamInfo : CMSG_STREAM_INFO* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("CRYPT32.dll", {
CryptMsgOpenToDecode: { parameters: ["u32", "u32", "u32", "usize", "pointer", "pointer"], result: "pointer" },
});
// lib.symbols.CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo)
// dwMsgEncodingType : DWORD -> "u32"
// dwFlags : DWORD -> "u32"
// dwMsgType : DWORD -> "u32"
// hCryptProv : HCRYPTPROV_LEGACY optional -> "usize"
// pRecipientInfo : CERT_INFO* optional -> "pointer"
// pStreamInfo : CMSG_STREAM_INFO* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
void* CryptMsgOpenToDecode(
uint32_t dwMsgEncodingType,
uint32_t dwFlags,
uint32_t dwMsgType,
size_t hCryptProv,
void* pRecipientInfo,
void* pStreamInfo);
C, "CRYPT32.dll");
// $ffi->CryptMsgOpenToDecode(dwMsgEncodingType, dwFlags, dwMsgType, hCryptProv, pRecipientInfo, pStreamInfo);
// dwMsgEncodingType : DWORD
// dwFlags : DWORD
// dwMsgType : DWORD
// hCryptProv : HCRYPTPROV_LEGACY optional
// pRecipientInfo : CERT_INFO* optional
// pStreamInfo : CMSG_STREAM_INFO* optional
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Crypt32 extends StdCallLibrary {
Crypt32 INSTANCE = Native.load("crypt32", Crypt32.class);
Pointer CryptMsgOpenToDecode(
int dwMsgEncodingType, // DWORD
int dwFlags, // DWORD
int dwMsgType, // DWORD
long hCryptProv, // HCRYPTPROV_LEGACY optional
Pointer pRecipientInfo, // CERT_INFO* optional
Pointer pStreamInfo // CMSG_STREAM_INFO* optional
);
}@[Link("crypt32")]
lib LibCRYPT32
fun CryptMsgOpenToDecode = CryptMsgOpenToDecode(
dwMsgEncodingType : UInt32, # DWORD
dwFlags : UInt32, # DWORD
dwMsgType : UInt32, # DWORD
hCryptProv : LibC::SizeT, # HCRYPTPROV_LEGACY optional
pRecipientInfo : CERT_INFO*, # CERT_INFO* optional
pStreamInfo : CMSG_STREAM_INFO* # CMSG_STREAM_INFO* optional
) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef CryptMsgOpenToDecodeNative = Pointer<Void> Function(Uint32, Uint32, Uint32, UintPtr, Pointer<Void>, Pointer<Void>);
typedef CryptMsgOpenToDecodeDart = Pointer<Void> Function(int, int, int, int, Pointer<Void>, Pointer<Void>);
final CryptMsgOpenToDecode = DynamicLibrary.open('CRYPT32.dll')
.lookupFunction<CryptMsgOpenToDecodeNative, CryptMsgOpenToDecodeDart>('CryptMsgOpenToDecode');
// dwMsgEncodingType : DWORD -> Uint32
// dwFlags : DWORD -> Uint32
// dwMsgType : DWORD -> Uint32
// hCryptProv : HCRYPTPROV_LEGACY optional -> UintPtr
// pRecipientInfo : CERT_INFO* optional -> Pointer<Void>
// pStreamInfo : CMSG_STREAM_INFO* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function CryptMsgOpenToDecode(
dwMsgEncodingType: DWORD; // DWORD
dwFlags: DWORD; // DWORD
dwMsgType: DWORD; // DWORD
hCryptProv: NativeUInt; // HCRYPTPROV_LEGACY optional
pRecipientInfo: Pointer; // CERT_INFO* optional
pStreamInfo: Pointer // CMSG_STREAM_INFO* optional
): Pointer; stdcall;
external 'CRYPT32.dll' name 'CryptMsgOpenToDecode';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "CryptMsgOpenToDecode"
c_CryptMsgOpenToDecode :: Word32 -> Word32 -> Word32 -> CUIntPtr -> Ptr () -> Ptr () -> IO (Ptr ())
-- dwMsgEncodingType : DWORD -> Word32
-- dwFlags : DWORD -> Word32
-- dwMsgType : DWORD -> Word32
-- hCryptProv : HCRYPTPROV_LEGACY optional -> CUIntPtr
-- pRecipientInfo : CERT_INFO* optional -> Ptr ()
-- pStreamInfo : CMSG_STREAM_INFO* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let cryptmsgopentodecode =
foreign "CryptMsgOpenToDecode"
(uint32_t @-> uint32_t @-> uint32_t @-> size_t @-> (ptr void) @-> (ptr void) @-> returning (ptr void))
(* dwMsgEncodingType : DWORD -> uint32_t *)
(* dwFlags : DWORD -> uint32_t *)
(* dwMsgType : DWORD -> uint32_t *)
(* hCryptProv : HCRYPTPROV_LEGACY optional -> size_t *)
(* pRecipientInfo : CERT_INFO* optional -> (ptr void) *)
(* pStreamInfo : CMSG_STREAM_INFO* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library crypt32 (t "CRYPT32.dll"))
(cffi:use-foreign-library crypt32)
(cffi:defcfun ("CryptMsgOpenToDecode" crypt-msg-open-to-decode :convention :stdcall) :pointer
(dw-msg-encoding-type :uint32) ; DWORD
(dw-flags :uint32) ; DWORD
(dw-msg-type :uint32) ; DWORD
(h-crypt-prov :uint64) ; HCRYPTPROV_LEGACY optional
(p-recipient-info :pointer) ; CERT_INFO* optional
(p-stream-info :pointer)) ; CMSG_STREAM_INFO* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $CryptMsgOpenToDecode = Win32::API::More->new('CRYPT32',
'LPVOID CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, WPARAM hCryptProv, LPVOID pRecipientInfo, LPVOID pStreamInfo)');
# my $ret = $CryptMsgOpenToDecode->Call($dwMsgEncodingType, $dwFlags, $dwMsgType, $hCryptProv, $pRecipientInfo, $pStreamInfo);
# dwMsgEncodingType : DWORD -> DWORD
# dwFlags : DWORD -> DWORD
# dwMsgType : DWORD -> DWORD
# hCryptProv : HCRYPTPROV_LEGACY optional -> WPARAM
# pRecipientInfo : CERT_INFO* optional -> LPVOID
# pStreamInfo : CMSG_STREAM_INFO* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f CryptMsgClose — 暗号メッセージハンドルを閉じて解放する。
- f CryptMsgGetParam — 暗号メッセージから指定したパラメーターを取得する。
- f CryptMsgOpenToEncode — エンコード用の暗号メッセージ(PKCS#7/CMS)を開く。
- f CryptMsgUpdate — 暗号メッセージにデータを追加して処理を更新する。