Windows Media Rights Manager 10 SDK でのライセンス チェーンの使用
Andrea Pruneda
Microsoft Corporation
February 2005
日本語版最終更新日 2006 年 5 月 30 日
適用対象:
Microsoft® Windows Media® Rights Manager 10 Software Development Kit (SDK)
概要: 大量のライセンスに対する速やかな更新を実現する Windows Media Rights Manager 10 SDK の新機能を説明します。ライセンス チェーンの動作、使用状況、および実装方法を解説します。
目次
はじめに
ライセンスのチェーン化の動作
ライセンス チェーンの実装
コンテンツの保護
ライセンス チェーン内での権利の設定
チェーン化されたライセンスの発行
例コード
関連情報
はじめに
ライセンスのチェーン化は、大量のライセンスに対する速やかな更新を実現する Microsoft® Windows Media® Rights Manager 10 の新機能です。ライセンス チェーンは、リーフ ライセンスおよびルート ライセンスの 2 つの部分から構成されています。チェーンを完了し、保護されたコンテンツにアクセスするためには、どちらのライセンスも必要です。
シンプル ライセンスは自己完結型です。その有効期限が切れるとライセンス全体が有効ではなくなり、コンテンツを再び再生する前に新しいライセンスの発行が必要になります。Windows Media デジタル著作権管理 (DRM) バージョン 9 および以前のバージョンで使用されているタイプは、シンプル ライセンスのみです。
チェーン化されたライセンスは、リーフ ライセンスおよびルート ライセンスから構成されています。リーフ ライセンスはコンテンツのロックを解除し、ルート ライセンスはリーフ ライセンスのロックを解除します。コンテンツにアクセスするには、プレーヤーのDRM コンポーネントでルート ライセンスとリーフ ライセンスのどちらも検索し、チェーンを完了する必要があります。Windows Media DRM 10 では、シンプル ライセンスとチェーン化されたライセンスのどちらもサポートされます。
ルート ライセンスおよびリーフ ライセンスは、それぞれ一連の権利を含んでいます。どちらのライセンスも有効であり、要求されているアクションを許可する必要があります。たとえば、チェーン化されたライセンスを使用してコンテンツを再生するには、ルート ライセンスとリーフ ライセンスは適切な AllowPlay = True を含んでいる必要があります。ルート ライセンスまたはリーフ ライセンスのどちらかの有効期限が切れている場合、ユーザーはそのライセンス要素が更新されるまでコンテンツにアクセスできません。
ライセンス チェーン形式が特に便利な理由は、次のとおりです。
- 複数のコンテンツ アイテムでルート ライセンスを共有できますが、異なるリーフ ライセンスが使用されます。
- 制約 (有効期限切れやカウントされる再生など) は、1 つのライセンス要素内のみに含めることが可能です。
権利やリーフ ライセンスとルート ライセンスの組み合わせなどのライセンス構成は柔軟であり、ユーザーのビジネス モデルに従ってセットアップすることが可能です。
たとえば、大規模なカタログが用意された定期契約サービスは、ライセンス チェーンを使用して、時間的な制約を持つ 1個のルート ライセンスと、個々のリーフ ライセンスを発行できます。定期契約の有効期限が切れた場合、更新が必要になるのはルート ライセンス 1 つのみです。たとえば、新規の消費者が定期契約サービスを申し込むと、有効期限が切れない 10,000 個のリーフ ライセンスおよび 30 日で有効期限が切れる 1 個のルート ライセンスが発行されます。月ごとの定期契約の有効期限が切れると、消費者は定期契約を更新し、さらに 30 日間有効な新しいルート ライセンスが発行されます。結果として、定期契約を更新するためには何千個ものライセンスではなく 1 個のライセンスを発行するだけで済むので、更新プロセスが大幅に高速化されます。
ライセンスのチェーン化の動作
ライセンス チェーンでは、ルート ライセンスはコンピュータまたはデバイスにバインドされ、リーフ ライセンスのロックを解除します。リーフ ライセンスはルート ライセンスにバインドされ、コンテンツのロックを解除します。したがって、保護されたコンテンツをプレーヤーで開こうとする場合、ライセンス チェーンを再構築する必要があります。
次の図では、プレーヤーによるライセンス チェーンの再構築方法を示します。
- プレーヤーはコンテンツ ヘッダー内の鍵 ID を使用して、リーフ ライセンスを検索します。
- リーフ ライセンスには、ルート ライセンスの鍵 ID と一致するアップリンク ID が含まれます。
- ルート ライセンスはリーフ ライセンスのロックを解除します。
- リーフ ライセンス内のコンテンツ鍵は、コンテンツのロックを解除します。
ライセンス チェーンの実装
このセクションでは、コンテンツの保護方法、権利の設定方法、およびライセンスの発行方法など、ライセンス チェーンのセットアップ方法を説明します。このセクションの最後には例コードが掲載されています。
コンテンツの保護
ライセンス チェーンを使用するコンテンツを保護する場合、WMRMHeader.AddUplink メソッドを使用して、コンテンツ ヘッダーにアップリンク ID を追加する必要があります。保護プロセス中に既に必要とされる鍵 ID はリーフ ライセンスを参照し、リーフ ライセンス内のアップリンク ID はルート ライセンスを参照します。コンテンツ ヘッダー内ではアップリンク ID は必須ではありませんが、推奨されます。アップリンク ID が含まれると、このコンテンツのライセンス要求にライセンス状態データが含まれます。このデータは、クライアント上のこのコンテンツの既存ライセンスに関する情報を示します。ライセンス発行者はコンテンツが既にライセンスを持っているかどうかを知ることができます。また、既にライセンスを持っている場合、カウントされる残りのアクション回数およびライセンスの有効期限を知ることができます。たとえば、ユーザー エクスペリエンスを向上させるために、ライセンス発行者は、有効期限切れ前にルート ライセンスを更新する場合や、すべてのコピー カウントを使用してしまったリーフ ライセンスを更新する場合があります。
ライセンス チェーン内での権利の設定
チェーン内の各ライセンスは、有効な一連の権利を含む必要があります。メディア プレーヤーの DRM コンポーネントでは、次のようにチェーン内の両方のライセンス内にある権利が評価されます。
- ルート ライセンスおよびリーフ ライセンスの両方に権利が存在する場合にのみ、アクションが許可されます。
- ルート ライセンスが任意の出力保護レベルを指定する場合、リーフ ライセンス内のすべての出力保護レベルは無視されます。
- ルート ライセンスおよびリーフ ライセンスのどちらにもカウントが含まれる場合、両方のライセンスが使用されるとどちらのカウントも減少します。ルート ライセンスのみが使用されると、ライセンス同期など、ルート ライセンス内のカウントのみが減少します。
- 再生リストの一部としてコンテンツの書き込みを許可するには、ルート ライセンスおよびリーフ ライセンスのどちらにも AllowPlaylistBurn 権利が与えられる必要があります。ただし、PlaylistBurnTrackCount 権利および MaxPlaylistBurnCount 権利は、リーフ ライセンス内でのみサポートされます。
ガイドライン
ライセンス チェーンに権利を設定する場合、リーフ ライセンスおよびルート ライセンス内での権利の設定方法によっては、特にカウントおよび有効期限切れに関して異なる結果に達する可能性があります。ライセンス チェーン内に権利を設定する場合、次のガイドラインを使用します。
- 基本的な権利の設定
既定の値に依存するのではなく、リーフ ライセンスおよびルート ライセンスの両方で権利を明示的に許可または拒否する必要があります。たとえば、両方のライセンス内で AllowPlay = True を指定します。
- カウントされるアクションの設定
ルート ライセンス内でカウントされるアクションは、コンテンツ アイテムごとにそれぞれ追跡されるわけではありません。たとえば、10 個のコンテンツ アイテムで 1 回の再生を許可するルート ライセンスが共有される場合、1 つのアイテムのみを 1回再生できます。つまり、コンテンツ アイテムごとにカウントされるアクションを指定するには、各リーフ ライセンスのみでカウントされるアクションを指定します。たとえば、定期契約サービスがユーザーによるデバイスへの各コンテンツ アイテムのコピーを 5 回まで許可するとします。この場合、サービスは各リーフ ライセンスで AllowCopy = 5 を指定します。
ライセンス権利は柔軟です。この動作を創造的な方法で使用できます。たとえば、ルート ライセンスに追加コピーを含めたり、カウントを書き込んだりできます。ユーザーはこれらを使用するコンテンツ アイテムを選択できます。
- 有効期限日の設定
ルート ライセンス内に有効期限日を指定します。たとえば、定期契約サービスで毎月末に有効期限が切れるコンテンツがある場合、有効期限日をルート ライセンス内でのみ指定します。ユーザーが定期契約を更新すると、新規の有効期限日を持つルート ライセンスが再発行されます。
- 制約の設定
ルート ライセンス内に制約を指定します。まず、ルート ライセンス内の制約は、リーフ ライセンス内で指定された制約よりも優先されます。次に、テクノロジの変化と共に、ルート内でのみこれらの制約を指定することで、ルート ライセンスを更新するだけでビジネス モデルのコンテンツ ポリシーを変更できます。
チェーン化されたライセンスの発行
チェーン化されたライセンスの発行は、シンプル ライセンスの発行に類似したプロセスに従います。つまり、ライセンス チャレンジからコンテンツ ヘッダーを取得し (ライセンスを事前配布しない場合)、対応する鍵を生成し、権利を設定してからクライアントにライセンスを送信します。
ただし、チェーン化されたライセンスを発行する場合、初めてライセンスを発行する場合を除いて、ルート ライセンスとリーフ ライセンスの両方を毎回発行する必要はありません。たとえば、定期契約の更新の場合は、ルート ライセンスの発行のみが必要です。その他の場合、まだユーザーが取得していないアイテム用の新規リーフ ライセンスの発行のみが必要です。Windows Media® Rights Manager 10 SDK は、チェーン化されたライセンスをコンテンツが使用する場合に、クライアント上の既存ライセンスに関するライセンス状態データを返す、新しいインターフェイスを提供します。たとえば、5 日後に有効期限が切れるルート ライセンスをクライアントが既に持っていることや、リーフ ライセンスに 10 回の再生カウントが残っていることを判断できます。
Windows Media Rights Manager SDK は、チェーン化されたライセンスと動作する次の新しいインターフェイスを提供します。
- ルート ライセンスの鍵は 8 バイトの長さが必要なため、ルート ライセンス鍵を生成するために WMRMKeys.GenerateKeyEx メソッドを使用します。引き続き、シンプル ライセンスおよびリーフ ライセンスには、7 バイトの鍵を生成します。
- リーフ ライセンスには、ルート ライセンスの鍵および鍵 ID (アップリンク鍵および鍵 ID とも呼ばれる) を含める必要があります。これらを指定するには、WMRMLicGen.UplinkKey および WMRMLicGen.UplinkKid プロパティを使用します。
- クライアント上にある既存のチェーン化されたライセンスに関する情報を取得するには、WMRMChallenge.Uplinks プロパティを使用します (コンテンツが保護されている場合にコンテンツ ヘッダー内でアップリンク ID が指定されている限り、この情報はライセンス要求内に含まれます)。これで、ルート ライセンスおよびリーフ ライセンスを発行するかどうかを判断できます。データを処理するために、WMRMUplinkCollection、WMRMUplink、および WMRMLicenseStateData の各オブジェクトを使用します。
例コード
このセクションでは、チェーン化されたライセンスの使用方法を示すために、2 つのコード例を掲載します。
- 1 番目のコード例では、コンテンツを保護しながらアップリンク ID を指定する方法を示します。
- 2 番目のコード例では、コンテンツ ヘッダーが含まれたライセンス要求への応答時に、チェーン化されたライセンスを発行する方法を示します。
読みやすくするために、エラー チェックは含まれていません。
コンテンツ保護の例コード
<%@ LANGUAGE="VBScript"%>
<%
Response.Buffer = True
Response.Expires = 0
On Error Resume Next
Do
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 変数を宣言します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Dim KeyObj ' WMRMKeys オブジェクト
Dim HeaderObj ' WMRMHeader オブジェクト
Dim ProtectObj ' WMRMProtect オブジェクト
Dim Seed ' ライセンス鍵シード
Dim ContentServerPrivKey ' コンテンツ サーバーの秘密鍵
Dim ContentServerPubKey ' コンテンツ サーバーの公開鍵
Dim LeafKID ' リーフ ライセンスの鍵 ID
Dim RootKID ' ルート ライセンスの鍵 ID
Dim ContentKey ' リーフ ライセンスの鍵
Dim Header ' コンテンツ ヘッダー
Dim LicURL ' ライセンス取得 URL
Dim SecVersion ' 必須の個別化バージョン
Dim InputFile ' 入力ファイルのパスおよび名前
Dim OutputFile ' 保護されたファイルのパスおよび名前
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 変数を設定します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Seed = <replace with your license key seed>
ContentServerPrivKey = <replace with private key of content server>
ContentServerPubKey = <replace with public key of content server>
LicURL = <replace with your license acquisition URL>
SecVersion = <replace with required individualization version>
InputFile = <replace with input file name and path>
OutputFile = <replace with output file name and path>
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ルート鍵 ID およびリーフ鍵 ID を生成します。
' 定期契約モデルでは、ルート KID 値を 1 回だけ
' 生成する必要があります。また、他のコンテンツ
' アイテムのデータベースからルート KID 値を取得します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set KeyObj = Server.CreateObject("WMRMObjs.WMRMKeys")
RootKID = KeyObj.GenerateKeyID()
LeafKID = KeyObj.GenerateKeyID()
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' リーフ ライセンスのコンテンツ鍵を生成します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
KeyObj.Seed = Seed
KeyObj.KeyID = LeafKID
ContentKey = KeyObj.GenerateKey()
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
'コンテンツ ヘッダー内部に値をセットし、署名します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set HeaderObj = Server.CreateObject("WMRMObjs.WMRMHeader")
HeaderObj.KeyID = LeafKID
HeaderObj.AddUplink(RootKID)
HeaderObj.LicenseAcqURL = LicURL
Call HeaderObj.SetCheckSum(ContentKey)
HeaderObj.IndividualizedVersion = SecVersion
Call HeaderObj.Sign(ContentServerPrivKey)
Header = HeaderObj.Header
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
'コンテンツを保護します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set ProtectObj = Server.CreateObject("WMRMObjs.WMRMProtect")
ProtectObj.InputFile = InputFile
ProtectObj.Key = ContentKey
ProtectObj.Header = Header
ProtectObj.V1KeyID = LeafKID
Call ProtectObj.ProtectFile(OutputFile)
Response.Write "The file has been protected."
Loop While False
If Err.Number <> 0 Then
Response.Write CStr(Hex(err.number)) + Err.Description
End if
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
'オブジェクトをクリアします。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set KeyObj = Nothing
Set HeaderObj = Nothing
Set ProtectObj = Nothing
%>
チェーン化されたライセンスの発行の例コード
<%@ LANGUAGE="VBScript"%>
<%
Response.Buffer = True
Response.Expires = 0
Do
On Error Resume Next
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 変数を宣言します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Dim ChallengeObj ' WMRMChallenge オブジェクト
Dim ChainCollObj ' WMRMUplinkCollection オブジェクト
Dim ChainObj ' WMRMUplink オブジェクト
Dim LeafLicenseStateObj ' WMRMLicenseStateData オブジェクト
Dim RootLicenseStateObj ' WMRMLicenseStateData オブジェクト
Dim HeaderObj ' WMRMHeader オブジェクト
Dim KeyObj ' WMRMKeys オブジェクト
Dim RightsObj ' WMRMRights オブジェクト
Dim LicenseObj ' WMRMLicGen オブジェクト
Dim ResponseObj ' WMRMResponse オブジェクト
Dim ContentServerPubKey ' コンテンツ サーバーの公開鍵
Dim Seed ' ライセンス鍵シード
Dim Delivery ' 配信フラグ
Dim Silent ' 無人配信フラグ
Dim strLicenseRequested ' ライセンス要求文字列
Dim varClientInfo ' クライアント情報
Dim varHeader ' コンテンツ ヘッダー
Dim blnResult ' 署名検証
Dim LeafKID ' リーフ ライセンスの鍵 ID
Dim IndiVersion ' DRM コンポーネントのセキュリティ バージョン
Dim RootKID ' ルート ライセンスの鍵 ID
Dim RootCat ' ルート ライセンスのライセンス状態データ
Dim RCountArray ' カウント配列
Dim RDateArray ' 日付配列
Dim IssueRoot ' ルート ライセンス フラグ
Dim Rcounts ' 残りのカウント
Dim RstartDate ' 開始日
Dim RExpDate ' 有効期限日
Dim LeafCat ' リーフ ライセンスのライセンス状態データ
Dim LCountArray ' カウント配列
Dim LDateArray ' 日付配列
Dim IssueLeaf ' リーフ ライセンス フラグ
Dim Lcounts ' 残りのカウント
Dim LstartDate ' 開始日
Dim LExpDate ' 有効期限日
Dim LeafKey ' リーフ ライセンスの鍵
Dim LeafRights ' リーフ ライセンスの権利文字列
Dim LeafLicense ' リーフ ライセンスのライセンス
Dim RootKey ' ルート ライセンスの鍵
Dim RootRights ' ルート ライセンスの権利文字列
Dim RootLicense ' ルート ライセンス
Dim LicResponse ' ライセンス応答
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 変数を設定します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
ContentServerPubKey = <replace with content server public key>
Seed = <replace with license key seed>
Delivery = ""
Silent = True
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 無人配信または非無人配信の要求を確認します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
If (Request.Form("nonsilent") <> "") Then Silent = False
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ライセンス要求を取得します。
' クライアント情報およびコンテンツ ヘッダーを取得します。
'
' このサンプルは事前配信モデルには適用されません。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set ChallengeObj = Server.CreateObject("WMRMObjs.WMRMChallenge")
strLicenseRequested = Request.Form("challenge")
ChallengeObj.Challenge = strLicenseRequested
varClientInfo = ChallengeObj.ClientInfo
varHeader = ChallengeObj.Header
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ヘッダー オブジェクト内部にコンテンツ ヘッダーを配置します。KID と
' 必須の個別化バージョンを取得します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set HeaderObj = Server.CreateObject("WMRMObjs.WMRMHeader")
HeaderObj.Header = varHeader
blnResult = HeaderObj.Verify(ContentServerPubKey)
LeafKID = HeaderObj.KeyID
IndiVersion = HeaderObj.IndividualizedVersion
' IndividualizedVersion がコンテンツ ヘッダー内で
' 指定されない場合、エラーをリセットします。
If (Err.Number <> 0) Then Err.clear
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ライセンス状態データを取得して、どのライセンス要素を
' 発行するのか判断します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set ChainCollObj = ChallengeObj.Uplinks
If (Err.Number <> 0) Then ' 利用可能なライセンス状態データはありません。
' データベースからルート KID を取得する必要があります。
RootKID = <Replace with a root KID>
' 利用可能なライセンス状態データがないので、どちらのライセンスも発行します。
IssueRoot = True
IssueLeaf = True
Else
' ルート ライセンスのライセンス状態データと鍵 ID を取得します。
' コレクション内のアイテム 1 はルートに対応します。
Set ChainObj = ChainCollObj.item(1)
RootKID = ChainObj.KID
' ライセンス状態データを取得して、ルート ライセンスを発行するかどうかを判断します。
Set RootLicenseStateObj = ChainObj.LicenseState
RootCat = cstr(RootLicenseStateObj.Category)
Select Case RootCat
' この例では、権利を持つ既存のルート ライセンスが見つからない
' 場合にのみルート ライセンスが発行されます (case 0)。
case 0
' ルート ライセンスには権利が含まれています。
IssueRoot = True
case 1
' ルート ライセンスには無制限の再生カウントが含まれています。
IssueRoot = False
case 2
' ルート ライセンスには残りの再生カウントが含まれています。
RCountArray = RootLicenseStateObj.Counts
RCounts = cstr(RCountArray(0))
IssueRoot = False
case 3
' ルート ライセンスには開始日が含まれています。
RDateArray = RootLicenseStateObj.Dates
RStartDate = cstr(RDateArray(0))
IssueRoot = False
case 4
' ルート ライセンスには有効期限日が含まれています。.
RDateArray = RootLicenseStateObj.Dates
RExpDate = cstr(RDateArray(0))
IssueRoot = False
case 5
' ルート ライセンスには開始日および有効期限日が含まれています。
RDateArray = RootLicenseStateObj.Dates
RStartDate = cstr(RDateArray(0))
RExpDate = cstr(RDateArray(1))
IssueRoot = False
case 6
' ルート ライセンスには開始日および残りの再生カウントが含まれています。
RDateArray = RootLicenseStateObj.Dates
RStartDate = cstr(RDateArray(0))
RCountArray = RootLicenseStateObj.Counts
RCounts = cstr(RCountArray(0))
IssueRoot = False
case 7
' ルート ライセンスには有効期限日および残りの再生カウントが含まれています。
RDateArray = RootLicenseStateObj.Dates
RExpDate = cstr(RDateArray(0))
RCountArray = RootLicenseStateObj.Counts
RCounts = cstr(RCountArray(0))
IssueRoot = False
case 8
' リート ライセンスには、開始日、有効期限日、および
' 残りの再生カウントが含まれています。
RDateArray = RootLicenseStateObj.Dates
RStartDate = cstr(RDateArray(0))
RExpDate = cstr(RDateArray(1))
RCountArray = RootLicenseStateObj.Counts
RCounts = cstr(RCountArray(0))
IssueRoot = False
case 9
' ルート ライセンスは最初の使用後に有効期限が切れます。
IssueRoot = False
End Select
' ライセンス状態データを取得して、リーフ ライセンスを発行するかどうかを判断します。
' コレクション内のアイテム 0 はリーフに対応します。
Set ChainObj = ChainCollObj.item(0)
' ライセンス状態データを取得して、リーフ ライセンスを発行するかどうかを判断します。
Set LeafLicenseStateObj = ChainObj.LicenseState
LeafCat = cstr(LeafLicenseStateObj.Category)
Select Case LeafCat
' この例では、権利を持つ既存のリーフ ライセンスが見つからない
' 場合にのみリーフ ライセンスが発行されます (case 0)。
case 0
' リーフ ライセンスには権利が含まれていません。
IssueLeaf = True
case 1
' リーフ ライセンスには無制限の再生カウントが含まれています。
IssueLeaf = False
case 2
' リーフ ライセンスには残りの再生カウントが含まれています。
LCountArray = LeafLicenseStateObj.Counts
LCounts = cstr(LCountArray(0))
IssueLeaf = False
case 3
' リーフ ライセンスには開始日が含まれています。
LDateArray = LeafLicenseStateObj.Dates
LStartDate = cstr(LDateArray(0))
IssueLeaf = False
case 4
' リーフ ライセンスには有効期限日が含まれています。
LDateArray = LeafLicenseStateObj.Dates
LExpDate = cstr(LDateArray(0))
IssueLeaf = False
case 5
' リーフ ライセンスには開始日および有効期限日が含まれています。
LDateArray = LeafLicenseStateObj.Dates
LStartDate = cstr(LDateArray(0))
LExpDate = cstr(LDateArray(1))
IssueLeaf = False
case 6
' リーフ ライセンスには開始日および残りの再生カウントが含まれています。
LDateArray = LeafLicenseStateObj.Dates
LStartDate = cstr(LDateArray(0))
LCountArray = LeafLicenseStateObj.Counts
LCounts = cstr(LCountArray(0))
IssueLeaf = False
case 7
' リーフ ライセンスには有効期限日および残りの再生カウントが含まれています。
LDateArray = LeafLicenseStateObj.Dates
LExpDate = cstr(LDateArray(0))
LCountArray = LeafLicenseStateObj.Counts
LCounts = cstr(LCountArray(0))
IssueLeaf = False
case 8
' リーフ ライセンスには、開始日、有効期限日、および
' 残りの再生カウントが含まれています。
LDateArray = LeafLicenseStateObj.Dates
LStartDate = cstr(LDateArray(0))
LExpDate = cstr(LDateArray(1))
LCountArray = LeafLicenseStateObj.Counts
LCounts = cstr(LCountArray(0))
IssueLeaf = False
case 9
' ルート ライセンスは最初の使用後に有効期限が切れます。
IssueLeaf = False
End Select
End if
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' 鍵を生成します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set KeyObj = Server.CreateObject("WMRMObjs.WMRMKeys")
KeyObj.KeyID = LeafKID
KeyObj.Seed = Seed
LeafKey = KeyObj.GenerateKey()
' ルート ライセンスの 8 バイトの鍵を生成します。
KeyObj.KeyID = RootKID
RootKey = KeyObj.GenerateKeyEx(8)
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' リーフ ライセンスの権利を設定します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set RightsObj = Server.CreateObject("WMRMObjs.WMRMRights")
RightsObj.AllowPlay = True
RightsObj.AllowCopy = True
RightsObj.AllowCollaborativePlay = False
RightsObj.AllowBackupRestore = False
RightsObj.AllowPlaylistBurn = False
RightsObj.CopyCount = 5
RightsObj.GracePeriod = 24
RightsObj.MinimumClientSDKSecurity = 3000
RightsObj.MinimumSecurityLevel = 1000
' 権利文字列を取得します。
LeafRights = RightsObj.GetAllRights
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ルート ライセンスに権利を設定します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
RightsObj.Reset()
RightsObj.AllowPlay = True
RightsObj.AllowCopy = True
RightsObj.AllowCollaborativePlay = False
RightsObj.AllowBackupRestore = False
RightsObj.AllowPlaylistBurn = False
RightsObj.GracePeriod = 24
RightsObj.MinimumClientSDKSecurity = 3000
RightsObj.MinimumSecurityLevel = 1000
RightsObj.ExpirationDate = "#20051231Z#"
RightsObj.DeleteOnClockRollback = False
RightsObj.DisableOnClockRollback = True
' 権利文字列を取得します。
RootRights = RightsObj.GetAllRights
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' リーフ ライセンスを生成します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set LicenseObj = Server.CreateObject("WMRMObjs.WMRMLicgen")
LicenseObj.KeyID = LeafKID
LicenseObj.SetKey "", LeafKey
LicenseObj.Priority = 10
LicenseObj.Rights = LeafRights
LicenseObj.ClientInfo = varClientInfo
LicenseObj.BindToPubKey = ContentServerPubKey
LicenseObj.IndividualizedVersion = IndiVersion
' ルート ライセンスの鍵および鍵 ID を指定します。
LicenseObj.UplinkKid = RootKID
LicenseObj.UplinkKey = RootKey
LeafLicense = LicenseObj.GetLicenseToDeliver()
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' ルート ライセンスを生成します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
Set LicenseObj = Nothing
Set LicenseObj = Server.CreateObject("WMRMObjs.WMRMLicgen")
LicenseObj.KeyID = RootKID
LicenseObj.SetKey "", RootKey
LicenseObj.Priority = 10
LicenseObj.Rights = RootRights
LicenseObj.ClientInfo = varClientInfo
LicenseObj.BindToPubKey = ContentServerPubKey
LicenseObj.IndividualizedVersion = IndiVersion
RootLicense = LicenseObj.GetLicenseToDeliver()
Delivery = "deliver"
Loop While False
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
' エラー メッセージを送信するか、またはライセンスを配信します。
'"""""""""""""""""""""""""""""""""""""""""""""""""""""
If (Delivery = "" and Err.Number <> 0) Then
Response.Write cstr(hex(err.number)) + " :" & Err.Description
ElseIf (Delivery = "deliver") Then
Set ResponseObj = Server.CreateObject("WMRMObjs.WMRMResponse")
If (IssueLeaf = True) Then
' リーフ ライセンスをライセンス応答内に含めます。
Call ResponseObj.AddLicense("2.0.0.0", LeafLicense)
End If
If (IssueRoot = True) Then
' ルート ライセンスをライセンス応答内に含めます。.
Call ResponseObj.AddLicense("2.0.0.0", RootLicense)
End If
If (Silent = True) Then
LicResponse = ResponseObj.GetLicenseResponse()
Response.Write LicResponse
ElseIf (Silent = False) Then
' これは値を渡すために引用を置換します。
' ResponseObj.ReplaceQuotesWith = """""" ' For VBScript.
ResponseObj.ReplaceQuotesWith = "\""" ' For JScript.
LicResponse = ResponseObj.GetLicenseResponse()
' この simple_ns.asp はサンプル ファイルです。
' Windows Media Rights Manager SDK に含まれています。.
%>
<!-- #include file="simple_ns.asp" -->
<%
End If
End If
' オブジェクトをクリアします。
Set ChallengeObj = Nothing
Set ChainCollObj = Nothing
Set ChainObj = Nothing
Set LicenseStateObj = Nothing
Set HeaderObj = Nothing
Set KeyObj = Nothing
Set RightsObj = Nothing
Set LicenseObj = Nothing
Set ResponseObj = Nothing
%>
関連情報
- 定期契約を使用するオンライン ストアのセットアップに関する技術的な詳細については、 『Windows Media Player 10 を使用した定期契約オンライン ストアの作成』ホワイト ペーパー (http://www.microsoft.com/japan/windows/windowsmedia/knowledgecenter/technicalarticles.aspx#digitalrightsmanagement) をダウンロードしてください。
- Windows Media® テクノロジの一般的な情報については、Windows Media Web ページ (http://www.microsoft.com/japan/windows/windowsmedia/default.mspx) を参照してください。
- Windows Media 10 SDK のコンポーネントの詳細については、「Windows Media SDK コンポーネントについて」の Web ページ (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_winmedsdk.asp) (英語) を参照してください。
- Windows Media Rights Manager 10 SDK をダウンロードするには、Windows Media ライセンス申し込みフォームの Web ページ (http://wmlicense.smdisp.net/licenserequest/) (英語) にアクセスし、ライセンス申し込みフォームをオンラインで提出してください。マイクロソフトから使用許諾契約書が電子メールで送信されます。契約書に署名し、返送してください。その後、SDK をダウンロードするためのパスワードおよびリンクが送信されます。
|