IWMDRMWriter
COM公式ドキュメント
IWMDRMWriter インターフェイスは、ASF ファイル内のコンテンツに DRM 保護を適用するためのサポートを提供します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GenerateKeySeed メソッドは、DRM キーシードを生成します。
| pwszKeySeed | LPWSTR | out | キーシードを格納するワイド文字の null 終端文字列へのポインター。文字列のサイズを取得するには NULL を設定します。サイズは pcwchLength に返されます。 |
| pcwchLength | DWORD* | inout | pwszKeySeed のサイズ(ワイド文字単位)を格納する DWORD へのポインター。このサイズには終端の null 文字が含まれます。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
同じキーシードを複数のファイルで使用すべきであるため、このメソッドが使用されることはまれです。アプリケーションによって作成されるすべてのファイル、または同じサーバーから配信されるすべてのファイルに対して同じキーシードを使用することも、ファイルの一部のサブセットに対して使用することもできます。
GenerateKeyID メソッドは、DRM キー ID を生成します。
| pwszKeyID | LPWSTR | out | キー識別子を格納するワイド文字の null 終端文字列へのポインター。文字列のサイズを取得するには NULL を設定します。サイズは pcwchLength に返されます。 |
| pcwchLength | DWORD* | inout | pwszKeyID のサイズ(ワイド文字単位)を格納する DWORD へのポインター。このサイズには終端の null 文字が含まれます。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
各ファイルは、それぞれ独自のキー ID を持つ必要があります。
GenerateSigningKeyPair メソッドは、DRM ヘッダーオブジェクトの署名に使用される公開キーと秘密キーのペアを生成します。
| pwszPrivKey | LPWSTR | out | 秘密キーを格納するワイド文字の null 終端文字列へのポインター。文字列のサイズを取得するには NULL を設定します。サイズは pcwchPrivKeyLength に返されます。このキーを使用して DRM_HeaderSignPrivKey プロパティを設定します。 |
| pcwchPrivKeyLength | DWORD* | inout | pwszPrivKey のサイズ(ワイド文字単位)を格納する DWORD へのポインター。このサイズには終端の null 文字が含まれます。 |
| pwszPubKey | LPWSTR | out | 公開キーを格納するワイド文字の null 終端文字列へのポインター。文字列のサイズを取得するには NULL を設定します。サイズは pcwchPubKeyLength に返されます。このキーはライセンスサーバーとのみ共有されます。これにより、ユーザーがファイルのコンテンツライセンスを取得しようとするときに、ライセンスサーバーが DRM ヘッダーオブジェクトの署名を検証できるようになります。 |
| pcwchPubKeyLength | DWORD* | inout | pwsPubKey のサイズ(ワイド文字単位)を格納する DWORD へのポインター。このサイズには終端の null 文字が含まれます。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
これらのキーを使用して ASF ヘッダーオブジェクトに適用される署名を、DRM_LASignaturePrivKey やファイル内のデジタル署名オブジェクトを構成するその他のプロパティを使用して DRM ヘッダーオブジェクトに適用される署名と混同しないでください。
このメソッドで生成されるキーは失効リストの基礎となるため、使用する異なるキーペアの数は個々のビジネスニーズに基づきます。一般に、論理的なグループを形成し、同じ失効リストを共有する一連のコンテンツに対しては、同じキーペアを使用する必要があります。
SetDRMAttribute メソッドは、DRM ヘッダー属性のほか、その他の DRM 実行時プロパティを設定します。
| wStreamNum | WORD | in | 属性が適用されるストリーム番号を格納する WORD。 |
| pszName | LPWSTR | in | 属性名を格納する null 終端文字列へのポインター。サポートされる属性については「解説」を参照してください。 |
| Type | WMT_ATTR_DATATYPE | in | 属性データのデータ型を指定する WMT_ATTR_DATATYPE 列挙型の値。 |
| pValue | BYTE* | in | 属性データを格納するバイト配列へのポインター。 |
| cbLength | WORD | in | pValue が指す属性データのサイズ(バイト単位)。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、書き込み可能な DRM ファイル属性(DRM 属性一覧を参照)だけでなく、DRM 実行時コンポーネントによって使用されるものの、ファイル内の DRM ヘッダーには書き込まれない特定の DRM プロパティ(DRM プロパティを参照)の設定にも使用されるため、名前がやや適切ではありません。
プロパティ Use_Advanced_DRM および Use_DRM は、プロファイルを設定する前に指定できます。それ以外のプロパティは、プロファイルを設定する前に設定することはできません。次のコードスニペットは、DRM_ContentID プロパティを例として、この関数を呼び出す方法を示しています。pDRMWriter は IWMDRMWriter インターフェイスポインター、wszContentID は WCHAR 型の配列であるものとします。
hr = pDRMWriter->SetDRMAttribute( 0, g_wszWMDRM_ContentID,
WMT_TYPE_STRING, (BYTE *)wszContentID,
( wcslen( wszContentID ) + 1 ) * sizeof( WCHAR ) );
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMDRMWriter "{D6EA5DD0-12A0-43F4-90AB-A3FD451E6A07}" #usecom global IWMDRMWriter IID_IWMDRMWriter "{}" #comfunc global IWMDRMWriter_GenerateKeySeed 3 var,var #comfunc global IWMDRMWriter_GenerateKeyID 4 var,var #comfunc global IWMDRMWriter_GenerateSigningKeyPair 5 var,var,var,var #comfunc global IWMDRMWriter_SetDRMAttribute 6 int,wstr,int,var,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWMDRMWriter "{D6EA5DD0-12A0-43F4-90AB-A3FD451E6A07}" #usecom global IWMDRMWriter IID_IWMDRMWriter "{}" #comfunc global IWMDRMWriter_GenerateKeySeed 3 sptr,sptr #comfunc global IWMDRMWriter_GenerateKeyID 4 sptr,sptr #comfunc global IWMDRMWriter_GenerateSigningKeyPair 5 sptr,sptr,sptr,sptr #comfunc global IWMDRMWriter_SetDRMAttribute 6 int,wstr,int,sptr,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。