IWMSecureChannel
COM公式ドキュメント
IWMSecureChannel インターフェイスは、2 つの DLL が相互に検証を行い、セキュアな通信を実行できるようにするメソッドを提供します。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
WMSC_AddCertificate メソッドは、このオブジェクトが他のセキュアチャネルオブジェクトに提示できる証明書を追加します。証明書が 1 つも追加されていない場合、このオブジェクトは署名を持たないオブジェクトにのみ接続できます。
| pCert | IWMAuthorizer* | in | authorizer オブジェクトへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_AddSignature メソッドは、このオブジェクトが接続を試みる際に探す署名を追加します。署名が 1 つも追加されていない場合、このオブジェクトは他の任意のオブジェクトに接続します。
| pbCertSig | BYTE* | in | 証明書署名データのバイト配列へのポインタ。 |
| cbCertSig | DWORD | in | 証明書署名データのバイト数。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_Connect メソッドは、セキュアな接続を初期化します。
| pOtherSide | IWMSecureChannel* | in | セキュアチャネルオブジェクトへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
この関数により、チャネルの各側は、暗号化に使用されるシークレットを共有する前に、相手側を検証できます。 さらに、暗号化のシリアル化に使用される DLL シリアライザーが共有されるようになります。
WMSC_IsConnected メソッドは、セキュアな接続が有効かどうかを確認します。
| pfIsConnected | BOOL* | out | セキュアな接続が有効かどうかを示す値へのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_Disconnect メソッドは、セキュアな接続を破棄します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_GetValidCertificate メソッドは、接続の相手側から提供された証明書のコピーを返します。また、その証明書を検証した署名のインデックスも返します。
| ppbCertificate | BYTE** | out | ppbCertificate は、ユーザーが CoTaskMemFree で解放する必要があります。 証明書が提供されなかった場合、ppbCertificate は NULL になることがあります。 接続が確立されなかった場合、この関数は E_FAIL を返します。 |
| pdwSignature | DWORD* | out | 証明書の検証に署名が使用されなかった場合、pdwSignature は 0xFFFFFFFF になることがあります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_Encrypt メソッドは、DLL の境界をまたいでデータを暗号化します。
| pbData | BYTE* | in | 暗号化対象データを格納したバッファへのポインタ。インプレースで暗号化される。 |
| cbData | DWORD | in | 暗号化するデータのバイト数。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Encrypt は接続に対するロックを保持し、そのロックは Decrypt によって解放されます。そのため、暗号化と復号の呼び出しの間でスレッドをブロックしないようにする必要があります。
WMSC_Decrypt メソッドは、DLL の境界をまたいでデータを復号します。
| pbData | BYTE* | in | 復号対象データを格納したバッファへのポインタ。インプレースで復号される。 |
| cbData | DWORD | in | 復号するデータのバイト数。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Encrypt は接続に対するロックを保持し、そのロックは Decrypt によって解放されます。そのため、暗号化と復号の呼び出しの間でスレッドをブロックしないようにする必要があります。
WMSC_Lock メソッドは、セキュアな接続へのアクセスをロックします。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_Unlock メソッドは、セキュアな接続へのアクセスのロックを解除します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
WMSC_SetSharedData メソッドは、接続のネゴシエーション処理の際に使用されます。
| dwCertIndex | DWORD | in | 共有データを設定する証明書のゼロ起点インデックス。 |
| pbSharedData | BYTE* | in | 設定する共有データのバイト配列へのポインタ。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMSecureChannel "{2720598A-D0F2-4189-BD10-91C46EF0936F}" #usecom global IWMSecureChannel IID_IWMSecureChannel "{}" #comfunc global IWMSecureChannel_WMSC_AddCertificate 6 sptr #comfunc global IWMSecureChannel_WMSC_AddSignature 7 var,int #comfunc global IWMSecureChannel_WMSC_Connect 8 sptr #comfunc global IWMSecureChannel_WMSC_IsConnected 9 var #comfunc global IWMSecureChannel_WMSC_Disconnect 10 #comfunc global IWMSecureChannel_WMSC_GetValidCertificate 11 var,var #comfunc global IWMSecureChannel_WMSC_Encrypt 12 var,int #comfunc global IWMSecureChannel_WMSC_Decrypt 13 var,int #comfunc global IWMSecureChannel_WMSC_Lock 14 #comfunc global IWMSecureChannel_WMSC_Unlock 15 #comfunc global IWMSecureChannel_WMSC_SetSharedData 16 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMSecureChannel "{2720598A-D0F2-4189-BD10-91C46EF0936F}" #usecom global IWMSecureChannel IID_IWMSecureChannel "{}" #comfunc global IWMSecureChannel_WMSC_AddCertificate 6 sptr #comfunc global IWMSecureChannel_WMSC_AddSignature 7 sptr,int #comfunc global IWMSecureChannel_WMSC_Connect 8 sptr #comfunc global IWMSecureChannel_WMSC_IsConnected 9 sptr #comfunc global IWMSecureChannel_WMSC_Disconnect 10 #comfunc global IWMSecureChannel_WMSC_GetValidCertificate 11 sptr,sptr #comfunc global IWMSecureChannel_WMSC_Encrypt 12 sptr,int #comfunc global IWMSecureChannel_WMSC_Decrypt 13 sptr,int #comfunc global IWMSecureChannel_WMSC_Lock 14 #comfunc global IWMSecureChannel_WMSC_Unlock 15 #comfunc global IWMSecureChannel_WMSC_SetSharedData 16 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。