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

CryptSignAndEncryptMessage

関数
データに署名し受信者向けに暗号化したメッセージを生成する。
DLLCRYPT32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// CRYPT32.dll
#include <windows.h>

BOOL CryptSignAndEncryptMessage(
    CRYPT_SIGN_MESSAGE_PARA* pSignPara,
    CRYPT_ENCRYPT_MESSAGE_PARA* pEncryptPara,
    DWORD cRecipientCert,
    CERT_CONTEXT** rgpRecipientCert,
    const BYTE* pbToBeSignedAndEncrypted,
    DWORD cbToBeSignedAndEncrypted,
    BYTE* pbSignedAndEncryptedBlob,   // optional
    DWORD* pcbSignedAndEncryptedBlob
);

パラメーター

名前方向
pSignParaCRYPT_SIGN_MESSAGE_PARA*in
pEncryptParaCRYPT_ENCRYPT_MESSAGE_PARA*in
cRecipientCertDWORDin
rgpRecipientCertCERT_CONTEXT**in
pbToBeSignedAndEncryptedBYTE*in
cbToBeSignedAndEncryptedDWORDin
pbSignedAndEncryptedBlobBYTE*outoptional
pcbSignedAndEncryptedBlobDWORD*inout

戻り値の型: BOOL

各言語での呼び出し定義

// CRYPT32.dll
#include <windows.h>

BOOL CryptSignAndEncryptMessage(
    CRYPT_SIGN_MESSAGE_PARA* pSignPara,
    CRYPT_ENCRYPT_MESSAGE_PARA* pEncryptPara,
    DWORD cRecipientCert,
    CERT_CONTEXT** rgpRecipientCert,
    const BYTE* pbToBeSignedAndEncrypted,
    DWORD cbToBeSignedAndEncrypted,
    BYTE* pbSignedAndEncryptedBlob,   // optional
    DWORD* pcbSignedAndEncryptedBlob
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool CryptSignAndEncryptMessage(
    IntPtr pSignPara,   // CRYPT_SIGN_MESSAGE_PARA*
    IntPtr pEncryptPara,   // CRYPT_ENCRYPT_MESSAGE_PARA*
    uint cRecipientCert,   // DWORD
    IntPtr rgpRecipientCert,   // CERT_CONTEXT**
    IntPtr pbToBeSignedAndEncrypted,   // BYTE*
    uint cbToBeSignedAndEncrypted,   // DWORD
    IntPtr pbSignedAndEncryptedBlob,   // BYTE* optional, out
    ref uint pcbSignedAndEncryptedBlob   // DWORD* in/out
);
<DllImport("CRYPT32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CryptSignAndEncryptMessage(
    pSignPara As IntPtr,   ' CRYPT_SIGN_MESSAGE_PARA*
    pEncryptPara As IntPtr,   ' CRYPT_ENCRYPT_MESSAGE_PARA*
    cRecipientCert As UInteger,   ' DWORD
    rgpRecipientCert As IntPtr,   ' CERT_CONTEXT**
    pbToBeSignedAndEncrypted As IntPtr,   ' BYTE*
    cbToBeSignedAndEncrypted As UInteger,   ' DWORD
    pbSignedAndEncryptedBlob As IntPtr,   ' BYTE* optional, out
    ByRef pcbSignedAndEncryptedBlob As UInteger   ' DWORD* in/out
) As Boolean
End Function
' pSignPara : CRYPT_SIGN_MESSAGE_PARA*
' pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA*
' cRecipientCert : DWORD
' rgpRecipientCert : CERT_CONTEXT**
' pbToBeSignedAndEncrypted : BYTE*
' cbToBeSignedAndEncrypted : DWORD
' pbSignedAndEncryptedBlob : BYTE* optional, out
' pcbSignedAndEncryptedBlob : DWORD* in/out
Declare PtrSafe Function CryptSignAndEncryptMessage Lib "crypt32" ( _
    ByVal pSignPara As LongPtr, _
    ByVal pEncryptPara As LongPtr, _
    ByVal cRecipientCert As Long, _
    ByVal rgpRecipientCert As LongPtr, _
    ByVal pbToBeSignedAndEncrypted As LongPtr, _
    ByVal cbToBeSignedAndEncrypted As Long, _
    ByVal pbSignedAndEncryptedBlob As LongPtr, _
    ByRef pcbSignedAndEncryptedBlob As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CryptSignAndEncryptMessage = ctypes.windll.crypt32.CryptSignAndEncryptMessage
CryptSignAndEncryptMessage.restype = wintypes.BOOL
CryptSignAndEncryptMessage.argtypes = [
    ctypes.c_void_p,  # pSignPara : CRYPT_SIGN_MESSAGE_PARA*
    ctypes.c_void_p,  # pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA*
    wintypes.DWORD,  # cRecipientCert : DWORD
    ctypes.c_void_p,  # rgpRecipientCert : CERT_CONTEXT**
    ctypes.POINTER(ctypes.c_ubyte),  # pbToBeSignedAndEncrypted : BYTE*
    wintypes.DWORD,  # cbToBeSignedAndEncrypted : DWORD
    ctypes.POINTER(ctypes.c_ubyte),  # pbSignedAndEncryptedBlob : BYTE* optional, out
    ctypes.POINTER(wintypes.DWORD),  # pcbSignedAndEncryptedBlob : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('CRYPT32.dll')
CryptSignAndEncryptMessage = Fiddle::Function.new(
  lib['CryptSignAndEncryptMessage'],
  [
    Fiddle::TYPE_VOIDP,  # pSignPara : CRYPT_SIGN_MESSAGE_PARA*
    Fiddle::TYPE_VOIDP,  # pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA*
    -Fiddle::TYPE_INT,  # cRecipientCert : DWORD
    Fiddle::TYPE_VOIDP,  # rgpRecipientCert : CERT_CONTEXT**
    Fiddle::TYPE_VOIDP,  # pbToBeSignedAndEncrypted : BYTE*
    -Fiddle::TYPE_INT,  # cbToBeSignedAndEncrypted : DWORD
    Fiddle::TYPE_VOIDP,  # pbSignedAndEncryptedBlob : BYTE* optional, out
    Fiddle::TYPE_VOIDP,  # pcbSignedAndEncryptedBlob : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "crypt32")]
extern "system" {
    fn CryptSignAndEncryptMessage(
        pSignPara: *mut CRYPT_SIGN_MESSAGE_PARA,  // CRYPT_SIGN_MESSAGE_PARA*
        pEncryptPara: *mut CRYPT_ENCRYPT_MESSAGE_PARA,  // CRYPT_ENCRYPT_MESSAGE_PARA*
        cRecipientCert: u32,  // DWORD
        rgpRecipientCert: *mut *mut CERT_CONTEXT,  // CERT_CONTEXT**
        pbToBeSignedAndEncrypted: *const u8,  // BYTE*
        cbToBeSignedAndEncrypted: u32,  // DWORD
        pbSignedAndEncryptedBlob: *mut u8,  // BYTE* optional, out
        pcbSignedAndEncryptedBlob: *mut u32  // DWORD* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("CRYPT32.dll", SetLastError = true)]
public static extern bool CryptSignAndEncryptMessage(IntPtr pSignPara, IntPtr pEncryptPara, uint cRecipientCert, IntPtr rgpRecipientCert, IntPtr pbToBeSignedAndEncrypted, uint cbToBeSignedAndEncrypted, IntPtr pbSignedAndEncryptedBlob, ref uint pcbSignedAndEncryptedBlob);
"@
$api = Add-Type -MemberDefinition $sig -Name 'CRYPT32_CryptSignAndEncryptMessage' -Namespace Win32 -PassThru
# $api::CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob)
#uselib "CRYPT32.dll"
#func global CryptSignAndEncryptMessage "CryptSignAndEncryptMessage" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CryptSignAndEncryptMessage varptr(pSignPara), varptr(pEncryptPara), cRecipientCert, varptr(rgpRecipientCert), varptr(pbToBeSignedAndEncrypted), cbToBeSignedAndEncrypted, varptr(pbSignedAndEncryptedBlob), varptr(pcbSignedAndEncryptedBlob)   ; 戻り値は stat
; pSignPara : CRYPT_SIGN_MESSAGE_PARA* -> "sptr"
; pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA* -> "sptr"
; cRecipientCert : DWORD -> "sptr"
; rgpRecipientCert : CERT_CONTEXT** -> "sptr"
; pbToBeSignedAndEncrypted : BYTE* -> "sptr"
; cbToBeSignedAndEncrypted : DWORD -> "sptr"
; pbSignedAndEncryptedBlob : BYTE* optional, out -> "sptr"
; pcbSignedAndEncryptedBlob : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "CRYPT32.dll"
#cfunc global CryptSignAndEncryptMessage "CryptSignAndEncryptMessage" var, var, int, var, var, int, var, var
; res = CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob)
; pSignPara : CRYPT_SIGN_MESSAGE_PARA* -> "var"
; pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA* -> "var"
; cRecipientCert : DWORD -> "int"
; rgpRecipientCert : CERT_CONTEXT** -> "var"
; pbToBeSignedAndEncrypted : BYTE* -> "var"
; cbToBeSignedAndEncrypted : DWORD -> "int"
; pbSignedAndEncryptedBlob : BYTE* optional, out -> "var"
; pcbSignedAndEncryptedBlob : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL CryptSignAndEncryptMessage(CRYPT_SIGN_MESSAGE_PARA* pSignPara, CRYPT_ENCRYPT_MESSAGE_PARA* pEncryptPara, DWORD cRecipientCert, CERT_CONTEXT** rgpRecipientCert, BYTE* pbToBeSignedAndEncrypted, DWORD cbToBeSignedAndEncrypted, BYTE* pbSignedAndEncryptedBlob, DWORD* pcbSignedAndEncryptedBlob)
#uselib "CRYPT32.dll"
#cfunc global CryptSignAndEncryptMessage "CryptSignAndEncryptMessage" var, var, int, var, var, int, var, var
; res = CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob)
; pSignPara : CRYPT_SIGN_MESSAGE_PARA* -> "var"
; pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA* -> "var"
; cRecipientCert : DWORD -> "int"
; rgpRecipientCert : CERT_CONTEXT** -> "var"
; pbToBeSignedAndEncrypted : BYTE* -> "var"
; cbToBeSignedAndEncrypted : DWORD -> "int"
; pbSignedAndEncryptedBlob : BYTE* optional, out -> "var"
; pcbSignedAndEncryptedBlob : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	crypt32 = windows.NewLazySystemDLL("CRYPT32.dll")
	procCryptSignAndEncryptMessage = crypt32.NewProc("CryptSignAndEncryptMessage")
)

// pSignPara (CRYPT_SIGN_MESSAGE_PARA*), pEncryptPara (CRYPT_ENCRYPT_MESSAGE_PARA*), cRecipientCert (DWORD), rgpRecipientCert (CERT_CONTEXT**), pbToBeSignedAndEncrypted (BYTE*), cbToBeSignedAndEncrypted (DWORD), pbSignedAndEncryptedBlob (BYTE* optional, out), pcbSignedAndEncryptedBlob (DWORD* in/out)
r1, _, err := procCryptSignAndEncryptMessage.Call(
	uintptr(pSignPara),
	uintptr(pEncryptPara),
	uintptr(cRecipientCert),
	uintptr(rgpRecipientCert),
	uintptr(pbToBeSignedAndEncrypted),
	uintptr(cbToBeSignedAndEncrypted),
	uintptr(pbSignedAndEncryptedBlob),
	uintptr(pcbSignedAndEncryptedBlob),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function CryptSignAndEncryptMessage(
  pSignPara: Pointer;   // CRYPT_SIGN_MESSAGE_PARA*
  pEncryptPara: Pointer;   // CRYPT_ENCRYPT_MESSAGE_PARA*
  cRecipientCert: DWORD;   // DWORD
  rgpRecipientCert: Pointer;   // CERT_CONTEXT**
  pbToBeSignedAndEncrypted: Pointer;   // BYTE*
  cbToBeSignedAndEncrypted: DWORD;   // DWORD
  pbSignedAndEncryptedBlob: Pointer;   // BYTE* optional, out
  pcbSignedAndEncryptedBlob: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'CRYPT32.dll' name 'CryptSignAndEncryptMessage';
result := DllCall("CRYPT32\CryptSignAndEncryptMessage"
    , "Ptr", pSignPara   ; CRYPT_SIGN_MESSAGE_PARA*
    , "Ptr", pEncryptPara   ; CRYPT_ENCRYPT_MESSAGE_PARA*
    , "UInt", cRecipientCert   ; DWORD
    , "Ptr", rgpRecipientCert   ; CERT_CONTEXT**
    , "Ptr", pbToBeSignedAndEncrypted   ; BYTE*
    , "UInt", cbToBeSignedAndEncrypted   ; DWORD
    , "Ptr", pbSignedAndEncryptedBlob   ; BYTE* optional, out
    , "Ptr", pcbSignedAndEncryptedBlob   ; DWORD* in/out
    , "Int")   ; return: BOOL
●CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob) = DLL("CRYPT32.dll", "bool CryptSignAndEncryptMessage(void*, void*, dword, void*, void*, dword, void*, void*)")
# 呼び出し: CryptSignAndEncryptMessage(pSignPara, pEncryptPara, cRecipientCert, rgpRecipientCert, pbToBeSignedAndEncrypted, cbToBeSignedAndEncrypted, pbSignedAndEncryptedBlob, pcbSignedAndEncryptedBlob)
# pSignPara : CRYPT_SIGN_MESSAGE_PARA* -> "void*"
# pEncryptPara : CRYPT_ENCRYPT_MESSAGE_PARA* -> "void*"
# cRecipientCert : DWORD -> "dword"
# rgpRecipientCert : CERT_CONTEXT** -> "void*"
# pbToBeSignedAndEncrypted : BYTE* -> "void*"
# cbToBeSignedAndEncrypted : DWORD -> "dword"
# pbSignedAndEncryptedBlob : BYTE* optional, out -> "void*"
# pcbSignedAndEncryptedBlob : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。