(57)【要約】【課題】特定の１つまたは複数のターゲットプログラムが、暗号化データを解読できるようにする。【解決手段】データを対称鍵などの公開鍵を使用して暗号化すると共に暗号化を要求するターゲットプログラムの識別子などを秘密を暗号化データの中に封印しておき、暗号解読することを許されたターゲットプログラム（秘密より識別子が示されるプログラム）が暗号化データを解読する。【選択図】図１０
2010170570.tif 000002
【特許請求の範囲】
【請求項１】
複数の命令を記録したコンピュータ可読媒体であって、前記複数の命令は１つまたは複数のプロセッサにより実行されたときに当該１つまたは複数のプロセッサに、
ビットストリングを暗号解読するために封印解除オペレーションを起動し、前記ビットストリングを、前記封印解除オペレーションに対する入力として前記封印解除オペレーションに引き渡すステップと、
前記ビットストリングは対称鍵を使用して暗号化されており、前記複数の命令が前記ビットストリングを封印解除することが許可されている場合に前記封印解除オペレーションに応答して暗号解読されたビットストリングの少なくとも一部を受け取るステップと
を実行させることを特徴とするコンピュータ可読媒体。
【請求項２】
コンピューティグデバイスで実行される方法であって、
呼び出しプログラムからデータを受け取るステップと、
前記データを含む暗号テキストを対称鍵を使用して生成するステップであって、前記暗号テキストは、１つまたは複数のターゲットプログラムだけが前記暗号テキストから前記データを得ることが許されるという条件で、生成されているステップと
を有し、
前記暗号テキストを生成するステップは、
前記呼び出しプログラムの識別子を生成するステップと、
前記データ、前記呼び出しプログラムの識別子および前記１つまたは複数のターゲットプログラムの識別子の結合であるビットストリングを生成するステップと、
前記ビットストリングを暗号化して前記暗号テキストを生成するステップと
を有することを特徴とする方法。
【請求項３】
前記呼び出しプログラムの識別識別子は、暗号ハッシュ関数を前記呼び出しプログラムに適用することにより生成されるダイジェスト値を有することを特徴とする請求項２に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データの保存および検索に関し、具体的には、対称鍵暗号化に基づくデータの保存および検索に関する。
【背景技術】
【０００２】
コンピュータ上でデータを保護し、その結果、適当な当事者だけにデータが開示されるようにすることが、ユーザにとって重要な関心事になってきた。ユーザが保護を望むデータのタイプは、仕事関連のまたは個人的な機密文書、銀行口座番号、クレジットカード番号、社会保険番号など、さまざまである。さらに、不正な使用またはアクセスからユーザのコンピュータのデータを保護することが、ある第三者にとって重要である。たとえば、クレジットカード発行会社は、クレジットカード番号が保護され、その結果、コンピュータをハッキングする悪意のあるプログラムまたは当事者にその番号が開示されなくなることを望み、音楽会社は、コピーできないように音楽を保護することを望み、映画スタジオは、コピーできないように映画を保護することを望む。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】M. Bellare, R. Canetti, and H. Krawczyk, "Keying hash functions for message authentication," in Advances in Cryptology Crypto'96, number 1109 in Lecture Notes in CS, 1996.
【発明の概要】
【発明が解決しようとする課題】
【０００４】
コンピュータのデータを保護する解決策の１つが、汎用のコンピューティングデバイスを除去し、特殊目的の耐タンパボックスを、保護された内容の配布、保存、および表示に使用することである。しかし、この解決策は、ユーザが自分のコンピュータを拡張できなくなる（たとえば、ユーザが、そのような耐タンパボックスに追加のソフトウェアコンポーネントおよび／またはハードウェア構成要素をインストールできない）ので、望ましくない可能性がある。したがって、汎用コンピューティングデバイスでデータを保護できるようにする方法を提供することが有益である。
【課題を解決するための手段】
【０００５】
本明細書では、対称鍵暗号化に基づくデータの保存および検索を開示する。
【０００６】
一態様によれば、データが、呼出し側プログラムから受け取られる。データを含む暗号テキストが、対称暗号を使用して、１つまたは複数のターゲットプログラムだけが暗号テキストからデータを得られるようにすることができる形で生成される。
【０００７】
もう１つの態様によれば、ビットストリングが、呼出し側プログラムから受け取られる。呼出し側プログラムの識別子を検査して、呼出し側プログラムが、ビットストリングの暗号テキスト内で暗号化されたデータにアクセスすることを許可されるかどうかを判定する。データの保全性も検証され、対称鍵を使用してデータが暗号解読（暗号化解除と称することがある）される。呼出し側プログラムがデータへのアクセスを許可され、データの保全性が成功裡に検証される場合に限って、データが呼出し側プログラムに返される。
【図面の簡単な説明】
【０００８】
【図１】例示的なアクセス制御モデルを示す図である。
【図２】４つの異なる階層層を使用する例示的なアクセス制御環境を示す図である。
【図３】Ｓｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図４】ＵｎＳｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図５】Ｓｔｏｒｅ動作を実施する例示的なプロセスを示す流れ図である。
【図６】Ｓｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図７】Ｑｕｏｔｅ動作を実施する例示的なプロセスを示す流れ図である。
【図８】Ｖｅｒｉｆｙ動作を実施する例示的なプロセスを示す流れ図である。
【図９】ＰＫＵｎｓｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図１０】ＰＫＳｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図１１】ＧｅｎＳｅａｌ動作を実施する例示的なプロセスを示す流れ図である。
【図１２】本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境を示す図である。
【発明を実施するための形態】
【０００９】
図１に、例示的なアクセス制御モデル１００を示す。プリンシパル１０２が、保護されたリソースへのアクセスの要求を行うことができる。この要求は、ガード１０４によって受け取られ、ガード１０４は、リソース１０６へのアクセスを制御するコンポーネントである。ガード１０４は、要求を検査し、リソースのアクセスポリシならびに、要求を発行したプリンシパル１０２の識別などの他の情報に基づいて、要求を許可するかどうかを決定する。説明を簡単にするために、単一のプリンシパル１０２、ガード１０４、およびリソース１０６が図１に示されている。しかし、アクセス制御モデル１００に、複数のプリンシパル１０２、複数のガード１０４、および／または複数のリソース１０６を含めることができることに留意されたい。
【００１０】
プリンシパル１０２は、保護されたデータへのアクセスを要求するコンポーネントまたはモジュールを指す。この要求は、保護されたデータを検索する要求（たとえば、暗号鍵の検索の要求）、または保護されたデータを使用して動作を実行する要求（たとえば、保護されたデータを暗号鍵とすることができ、要求を、暗号鍵を使用する特定のデータの暗号化または暗号解読の要求とすることができる）とすることができる。プリンシパル１０２は、ハードウェア、ソフトウェア、ファームウェア、またはハードウェア、ソフトウェア、および／またはファームウェアの組合せで、コンポーネントまたはモジュールとして実施することができる。
【００１１】
ガード１０４は、保護されたデータへのアクセスを制御するコンポーネントまたはモジュールを指す。ガード１０４は、保護されたデータに関連するアクセスポリシ、ならびに他の情報（保護された内容へのアクセスを要求するプリンシパルの識別など）を使用して、プリンシパルが保護されたデータにアクセスすることが許可されるかどうかを判定する。ガード１０４が、要求元のプリンシパルが保護されたデータへのアクセスを許可されると判定する場合には、ガード１０４は、適当な形で要求に応答する（たとえば、要求が、保護されたデータに関する要求である場合には、保護されたデータをプリンシパルに返し、要求が、保護されたデータを使用して特定のデータを暗号化する要求である場合には、ガード１０４は、保護されたデータを使用して特定のデータを暗号化し、暗号テキスト（暗号化されたデータ）をプリンシパルに返す）。ガード１０４が、要求の性質に基づいてプリンシパルを制限することができることに留意されたい。たとえば、ガード１０４は、特定のプリンシパルが保護されたデータを使用して特定のデータに署名させることを許可することができるが、保護されたデータをその特定のプリンシパルに返すことを許可しないことができる。
【００１２】
ガード１０４は、開示ガードおよび／またはサービスガードとして特徴を表すこともできる。サービスガードは、プリンシパルからの要求の際に、保護されたデータ（たとえば暗号鍵）を開示せずに、保護されたデータを用いるある動作（たとえば、暗号化、暗号解読、ディジタル署名など）を実行する。その一方で、開示ガードは、許可された要求元に、保護されたデータを明らかにする。特定のガード１０４を、開示ガードおよびサービスガードの両方とすることができることに留意されたい。
【００１３】
リソース１０６は、アクセスが制限されるすべてのタイプのデータとすることができる。リソース１０６の例には、暗号鍵、銀行口座番号、クレジットカード番号、社会保険番号などの個人情報、パスワードなどを含めることができる。リソース１０６は、コンピューティングデバイス内の事実上何にでもすることができる。たとえば、リソース１０６を、物理メモリ（たとえばＲＡＭまたはＲＯＭ）、光ディスク、磁気ディスク、光ディスクドライブ、磁気ディスクドライブ、ビデオカード、サウンドカード、スマートカードなどにすることもできる。もう１つの例として、リソース１０６を、プロセス、ファイル、スレッド、セマフォなどのオペレーティングシステム抽象化とすることもできる。
【００１４】
本明細書の説明では、アクセス制御モデル１００を、主に、単一のコンピューティングデバイスで実施される物に関して説明する。しかし、このモデルの異なる部分を、異なるコンピューティングデバイスで実施できることを諒解されたい。たとえば、プリンシパル１０２をあるコンピューティングデバイスに置き、ガード１０４およびリソース１０６を別のコンピューティングデバイスに置くことができる。
【００１５】
あるコンピューティングデバイスのプリンシパルおよびガードを、任意の数ｎの階層層ｌnに分類することができる。図２に、４つの異なる階層層を使用する例示的なアクセス制御環境を示す。一実施形態では、層ｌ1が、ハードウェア層またはセキュリティカーネル層を指し、層ｌ2が、基本入出力システム（ＢＩＯＳ）層を指し、層3が、オペレーティングシステム（ＯＳ）層を指し、層4が、アプリケーション層を指す。
【００１６】
図２の例の環境では、最下位層（層ｌ1）が、ルートリソースを保護する。中間層（層ｌ2およびｌ3）のプログラムは、次に下位の層にアクセスを要求するプリンシパルとして働くと同時に、次に上位の層のプリンシパルに向かってガードとして働く。したがって、中間層によって、上位層のプリンシパルに関する機能性を追加することができる。
【００１７】
たとえば、プログラム１２０が、ガード１２６によって保護されるルートリソース１２８の検索を望むと仮定する。プログラム１２０は、モジュール１２２にルートリソース１２８へのアクセスを要求するプリンシパルとして働き、モジュール１２２は、そのリソースのガードとして働く。モジュール１２２が、リソース１２８のコピーを有する（たとえば、プログラム１２０または層ｌ4の他のプログラムによるリソースに関する前の要求に応答して、またはモジュール１２２が初期化され、コンピューティングデバイスにロードされる場合に、ガード１２６から得た）場合に、モジュール１２２は、プログラム１２０がリソースを検索することを許可されるかどうかを検査する。その後、モジュール１２２は、プログラム１２０がリソースを検索することを許可される場合に、プログラム１２０にリソースを返す。
【００１８】
しかし、モジュール１２２が、リソース１２８のコピーを有しない場合には、モジュール１２２は、モジュール１２４にルートリソースへのアクセスを要求するプリンシパルとして働き、モジュール１２４は、このリソースのガードとして働く。モジュール１２４が、リソース１２８のコピーを有する（たとえば、プログラム１２２または層ｌ3の他のモジュールによるリソースに関する前の要求に応答して、またはモジュール１２４が初期化され、コンピューティングデバイスにロードされる場合に、ガード１２６から得た）場合に、モジュール１２４は、プログラム１２２がリソースを検索することを許可されるかどうかを検査する。その後、モジュール１２４は、プログラム１２２がリソースを検索することを許可される場合に、プログラム１２２にリソースを返す。その後、モジュール１２２は、プログラム１２０がリソースを検索することを許可される場合に、プログラム１２０にリソースを返す。
【００１９】
しかし、モジュール１２４が、リソース１２８のコピーを有しない場合には、モジュール１２４は、ガード１２６にルートリソースへのアクセスを要求するプリンシパルとして働く。ガード１２６は、モジュール１２４がリソースの検索を許可されるかどうかを検査し、モジュール１２４がリソースの検索を許可される場合に、モジュール１２４にリソースを返す。モジュール１２４は、モジュール１２２がリソースの検索を許可される場合にモジュール１２２にリソースを返し、モジュール１２２は、プログラム１２０がリソースの検索を許可される場合にプログラム１２０にリソースを返す。
【００２０】
本明細書の説明では、図１のアクセス制御モデル１００を使用してソフトウェアの許可される動作を可能にすることに複数の場所で言及する。通常、ソフトウェアの許可された動作で保護されるリソースは、暗号鍵である。しかし、ソフトウェアの許可される動作が、アクセス制御モデル１００の使用の１つの例にすぎないことを諒解されたい。
【００２１】
アクセス制御モデル１００の使用のもう１つの例が、コンピュータに対するユーザの認証である。ほとんどの近代のコンピュータが、アクセス制御システムを有する。ユーザは、コンピュータにログオンし、その結果、コンピュータが、そのユーザが誰であるかを知るようになる。ログオンの後に、ユーザは、通常はシステムリソースへのアクセスを必要とするプログラムを実行する（たとえば、ファイルの読取、画面上のウィンドウへの書込など）。通常、コンピュータのアクセス制御システムが、相談される（たとえば、「ユーザｘがリソースｚに対する動作ｙを実行できるか」）。回答が「否」の場合には、プログラムはリソースにアクセスできない。
【００２２】
アクセス制御モデル１００の使用のもう１つの例が、リモートサービスに対するユーザの認証である。ウェブサイト（たとえばオンラインブローカまたはオンライン銀行）などのリモートサービスは、アクセス制御システムを有するとみなすことができる。リソースは、人々の銀行口座、預金、および株式である。ユーザがウェブサイトにログオンした後に、アクセス制御システムは、そのユーザが、リソース「銀行口座データ」に対する「読取」アクセス（最新の銀行明細書を検索するため）またはリソース「銀行口座１２３４５の１０００ドル」への「振替」アクセスなど、ユーザによって要求されたアクセスを実行することを許可されるかどうかを判定する。
【００２３】
アクセス制御モデル１００の使用のもう１つの例が、特定の建物または区域への物理的アクセスの制限である。たとえば、ユーザが朝に職場に到着した場合に、そのユーザは、自分のバッジを提示し、リソース「フロントドア」に対する「開く」動作を要求する。ある電子システム（ガード）が、バッジに保存された情報に基づいて、そのユーザが建物に入ることを許可されるかどうかを判定し、それに応じてドアの鍵をはずす。
【００２４】
コンピューティングデバイスは、プログラムが少なくとも１つの暗号リソースへの保護されたアクセス（開示ガードまたはサービスガードからの）を得られるようにすることが可能である場合に、プログラム（ソフトウェア）の認証された動作を可能にする。ある実施形態で、下で説明する認証および分離を可能にするコンピューティングデバイスが、認証された動作を可能にする。
【００２５】
プログラムＣを、別のプログラムＤから分離されると言うことができるのは、２つの点すなわち、（１）プログラムＣによってアクセスできるがプログラムＤによってアクセスできないメモリがあり、（２）プログラムＤが、プログラムＣの実行を開始できない（おそらくはプログラムＣによって決定されるエントリポイントを除いて）が満たされる場合である。プログラムは、その推移規則（実行可能コード）およびその初期状態（エントリポイントまたは命令ポインタＩＰの初期値）によって与えられる。第１の点によって、プログラムＤによる敵対する挙動が存在する場合であっても、データをプログラムＤによってアクセスできないメモリに保存することができるので、プログラムＣのプログラムコードおよび状態情報の保全性が保証される。この点によって、プログラムＣが、プログラムＤによる観察から機密データ（たとえば暗号鍵）を保護できるようにもなる。第２の点によって、Ｄが、敵対する形でエントリポイントを選択することによってＣの挙動を覆すことができないことが保証される。
【００２６】
さらに、プログラムＣが、プログラムＤの推移規則（プログラムコード）および初期状態の両方を識別できる場合に、プログラムＣが、プログラムＤを認証できると言うことができる。コンピューティングデバイスは、ｉがプログラムＣの層であるものとして、各層ｊ＜ｉについて、単一のプログラムＥjを除いて、すべての他のプログラムＤからの任意のプログラムＣに関する分離を可能にする。これによって、プログラムＣがそれを介してリソースへのアクセスを要求するガードのシーケンス、Ｅ1、Ｅ2、．．．、Ｅi-1を除くすべてのプログラムによる観察および干渉からプログラムが保護される。さらに、任意の層ｉについて、コンピューティングデバイスは、層ｉで実行中のプログラムが、層ｉ＋１内の少なくともいくつかのプログラムを認証できるようにする。この要件によって、プログラムが、次の層のプリンシパルからの要求に関するガードとして働けるようになる。この２つの観察によって、任意の層のプログラムが、前のプログラムにリソースへのアクセスを要求し、分離を介して保全性およびリソースを保護し、次の層のプリンシパルからの要求を認証をすることによって、リソースに関するガードとして働くことができるという誘導的な議論が与えられる。
【００２７】
分離は、物理メモリ保護を使用することによって実施することができる。この手法を、「空間における分離」または「空間分離」と称する。たとえば、多くの近代のマイクロプロセッサにみられるリングメモリ保護および仮想メモリ保護は、空間における分離を実施するのに十分である。特権モードで動作するオペレーティングシステムカーネル（層ｉ）は、アプリケーション（層ｉ＋１）のページテーブルをセットアップすることができ、すべてのアプリケーションが、物理メモリのうちで、オペレーティングシステムがそのアプリケーションの仮想アドレス空間にマッピングすることを選択した部分だけにアクセスできるようにする。さらに、カーネルは、アプリケーションがメモリマッピングを変更できないようにするためにアプリケーションの特権を制限し、アプリケーションが明確に定義されたエントリポイント（システム呼出し）でのみカーネルコードの実行を開始できることを保証する。
【００２８】
２つの層の間の分離を実施するもう１つの手法が、その実行を時間的に分離することである。この手法を、「時間における分離」または「時間分離」と称する。第１層ｉのプログラムが、完了まで実行され、あるリソースを使用不能にし、その後、終了する。その後、制御が、次の層ｉ＋１に移される。
【００２９】
認証は、後続の層（ｊ＝ｉ＋１）で行われる。プログラムＣが、ｊの構成のプログラム（推移規則）および初期状態を認証する。プログラムは、プログラムＣに層ｊのプログラムを検査させることによって認証することができる。すなわち、通常、プログラムＣは、層ｊのプログラムが含まれるメモリを読み取り、このメモリ範囲に対する暗号ダイジェストを計算する。この点での目標が、コードに関して他のプリンシパルによって行われるステートメントの評価ではなく、コードの識別の確認だけであることに留意されたい。したがって、証明書は、この点では不要である。
【００３０】
プログラムＣの第２の仕事は、プログラムＤの初期状態を識別することである。一般に、任意の実行段階でプログラムの初期状態を判定するという問題は、非常に困難である。したがって、プログラムＣは、プログラムＤの初期状態を制御する。現実的には、これは、プログラムＣが、初期状態σでプログラムＤの実行を開始する場合に、プログラムＣが、プログラムＤの初期状態σだけを確認できることを意味する。
【００３１】
要約すると、プログラムＤを認証するために、プログラムＣは、関連するとみなされるメモリ内容（プログラムおよびおそらくはデータ）を検査し、暗号ダイジェストを計算する。その後、プログラムＣが、プログラムＤの明確に定義されたエントリポイントに実行を移す。
【００３２】
リソースが暗号鍵である場合に、認証される動作によって、各オペレーティングシステムおよびアプリケーションプログラムが、１つまたは複数の秘密への排他的アクセスを有することが可能になる。上で述べた分離によって、敵対するコードによる攻撃から各秘密が保護される。上で述べたプログラムの認証によって、各秘密がそれを所有するプログラムだけに保持されるように、プログラムを識別できるようになる。
【００３３】
一般に、プログラム（図１のプリンシパル１０２）からの要求に対して、ガード１０４は、プログラムの識別を確立する（すなわち、ガード１０４がプログラムを認証する）。プログラムが、要求された秘密（リソース１０６）の所有者でない場合には、ガード１０４が、その要求を拒否する。そうでない場合には、ガード１０４は、秘密および、おそらくは、さらに、プログラムによって供給されるさらなる情報のある関数（秘密自体とすることができる）を計算し、その結果を返す。代替案では、要求を明示的に受け入れるか拒否するのではなく、ガード１０４が、要求をサービスするが、呼出し側の識別を結果に束縛する。この代替手法は、たとえば、ガードによって返される結果に機密情報が含まれない場合（たとえば、秘密を使用してディジタル署名を作る要求）に適当である。用語ゲーティング機能は、本明細書で、この両方の事例を指すのに使用される。
【００３４】
さらに、どちらの場合でも、ガード１０４は、呼出し側（プリンシパル１０２）を認証する。プリンシパル１０２の認証を、本明細書では、関数ＩＤ（）とも称し、この関数は、呼出し側プログラム（ガード１０４のゲーティング機能を呼び出すプログラム）のダイジェストを返す。ダイジェストは、ＳＨＡ１（Ｓｅｃｕｒｅ  Ｈａｓｈ  Ａｌｇｏｒｉｔｈｍ  １）、ＭＤ５（Ｍｅｓｓａｇｅ  Ｄｉｇｅｓｔ  ５）、ＭＤ２（Ｍｅｓｓａｇｅ  Ｄｉｇｅｓｔ  ２）などのさまざまな暗号ハッシュ関数（１方向ハッシュ関数とも称する）の１つまたは複数の使用、ｋｅｙｅｄ  ＭＡＣ（メッセージ確認コード）の使用など、さまざまな従来の形のどれかで生成することができる。
【００３５】
本明細書で説明するゲーティング機能の１つのクラスで、シールドストレージ（ｓｅａｌｅｄ  ｓｔｒａｇｅ）が実施される。シールドストレージの目的は、１つまたは複数のプログラムの特定の組（秘密を保存するプログラムによって定義される）だけが秘密を検索できるように、プログラムが秘密を保存できるようにすることである。１つの実施形態で、最初に秘密を保存した（封印（ｓｅａｌ）した）プログラムだけが、その秘密を回復（封印解除（ｕｎｓｅａｌ））することができる。通常、これらの秘密の寿命は、プログラムの個々の実行の時間を超える。プログラムの単一の実行中に使用される秘密を、保存（封印）することができ、その代わりに、分離および乱数ジェネレータを用いて、プログラムが単一の実行中の秘密を維持できるようにする。シールドストレージによって、プログラムが、時間的にオーバーラップしない可能性がある、異なる実行にまたがって秘密を維持できるようになる。層ｌiが、下記のインターフェースによって、次の層ｌi+1にシールドストレージを公開する（たとえば、「Ｓｅａｌ」動作および「ＵｎＳｅａｌ」動作および／またはＰＫＳｅａｌ動作およびＰＫＵｎｓｅａｌ動作を使用して）。
【００３６】
シールドストレージに関する本明細書の説明で、データの暗号化および暗号解読に使用される暗号鍵に言及する。これらの暗号鍵は、リソースへのアクセスを保護するガード（たとえば図１のガード１０４）に関連する鍵である。
【００３７】
本明細書の説明で、プログラムの識別子（たとえば、動作を呼び出すプログラムの識別子、またはリソースへのアクセスを許可されたターゲットプログラムの識別子）に言及する。本明細書では、これらの識別子を、しばしばダイジェストと称する。しかし、ダイジェストが、プログラムの識別子の１例にすぎないことを諒解されたい。プログラムの測定または他の表現であり、プログラムに対するすべての変更を検出できる他のタイプの識別子を、使用することができる。プログラムに対して何らかの変更が行われる（たとえば、保護されたデータへのアクセスを悪意をもって取得し、そのデータを利用する試みで敵対者が１つまたは複数の命令を変更する）場合に、プログラムの識別子は、その変更を反映しなければならない（たとえば、変更されないプログラムの識別子が、変更されたプログラムの識別子と異なる）。
【００３８】
Ｓｅａｌ動作は、入力として、封印されるデータ（たとえば秘密）を受け取る。Ｓｅａｌ動作は、任意選択として、秘密が明かされる（封印解除される）場合および／または相手を識別する条件を、入力として受け取る。一実施形態では、この条件が、データの検索（封印解除）を許可されるターゲットプログラムのダイジェストである。その代わりに、データの検索（封印解除）を許可されるプログラムを、他の形で識別することができる。たとえば、プログラムを、１つまたは複数の証明書を検証する公開鍵によって識別することができ、この証明書のそれぞれは、１つまたは複数のプログラムに関連する。
【００３９】
その代わりに、他の条件を、ターゲットプログラムの識別子に加えてまたはその代わりに使用することができる。たとえば、条件に、その間に秘密を明かす（封印解除する）ことができる特定の時間または曜日など、データを明かす（封印解除する）ことができる時に関する時間制約を含めることができる。もう１つの例として、条件に、秘密を明かす（封印解除する）ために提供しなければならないパスワードまたは他のデータの識別子を含めることができ、たとえば、パスワードの知識を有するプログラムのみによって秘密を封印解除することができる。
【００４０】
もう１つの例として、条件を、論理式（たとえば、一階論理で記述されたステートメント、術語論理で記述されたステートメントなど）とすることができる。その論理式が、評価され（たとえばガードによって）、その評価で真の表示が返される場合に限って、秘密が明かされる（封印解除される）。
【００４１】
もう１つの例では、条件を、ある言語（たとえば、Ｊａｖａ（登録商標）、Ｃ＊、Ｊａｖａ（登録商標）ｓｃｒｉｐｔ、ＶＢＳｃｒｉｐｔなど）の実行可能プログラムとすることができる。プログラムが、実行され（たとえばガードによって）、プログラムが、「真」または「満足」の何らかの表示を返す場合に限って、秘密が明かされる（封印解除される）。
【００４２】
条件が、ターゲットプログラムのダイジェストと共に供給されるのではなく、ターゲットプログラムのダイジェストである状況では、Ｓｅａｌ動作で、Ｓｅａｌ動作を呼び出すプログラムのダイジェストを使用することができる（これによって、ターゲットプログラムのダイジェストが暗黙のうちに入力される）。さらに、複数のターゲットプログラムのダイジェストを、Ｓｅａｌ動作に入力することができ、これによって、複数のターゲットプログラムがデータを明かす（封印解除する）ことができるようになる。
【００４３】
Ｓｅａｌ動作では、その入力（データおよびデータの検索（封印解除）を可能にする条件）が、呼出し側の識別子と共に暗号化される。Ｓｅａｌ動作では、暗号化された形で（暗号テキストとして）入力データが返される。Ｓｅａｌ動作では、封印されたデータの保全性を検証するのに使用することができる値（たとえば、メッセージ確認コード（ＭＡＣ）値）も返される。この返されるデータを用いると、下で詳細に説明するように、保存されたデータを後続のＵｎＳｅａｌ動作で参照できるようになる。
【００４４】
Ｓｅａｌ動作の擬似コードを、表Ｉに示す。表Ｉの擬似コードでは、ＩＤ（）が、上で説明したＩＤ（）関数を指し、ｅが、呼出し側に返される値（たとえばビットのストリングまたはシーケンス）を指し、ｄａｔａが、封印されるデータを指し、［ｔ1、．．．、ｔm］が、データの検索（封印解除）を許可される１つまたは複数（ｍ個）のターゲットプログラムのダイジェスト（または、１つまたは複数の他の条件）を指す。
表Ｉ
d=ID()
e= store {data, [t1, ..., tm], d)
return e
【００４５】
図３は、Ｓｅａｌ動作を実施する例示的なプロセス２００を示す流れ図である。プロセス２００は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００４６】
まず、封印される秘密を呼出し側から受け取る（動作２０２）。秘密を暗号化し、その結果、秘密を、特定のターゲットプログラムだけによって検索できるようにするか（動作２０４）、その代わりに、秘密を、１つまたは複数の特定の条件が満足される場合に限って検索できるようにする。暗号化された秘密を含む暗号テキストを、呼出し側に返す（動作２０６）。呼出し側のあたいダイジェストおよび／またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる（暗号テキストの一部として、または暗号テキストとは別に）。
【００４７】
ＵｎＳｅａｌ動作では、呼出し側プログラムが現在検索を望むデータを封印した時にＳｅａｌ動作によって返されたビットストリング（たとえば暗号鍵）を入力として受け取る。ＵｎＳｅａｌ動作では、データを明かす条件を入手し、その条件が満足されるかどうかを検査する。たとえば、条件に、データの検索（封印解除）を許可される１つまたは複数のターゲットプログラムのダイジェストが含まれる場合に、ＵｎＳｅａｌ動作では、これらのダイジェストを入手し、呼出し側プログラムが１つまたは複数のターゲットプログラムの１つであるかどうかを検査する。呼出し側プログラムが、１つまたは複数のターゲットプログラムの１つでない場合には、ＵｎＳｅａｌ動作が失敗し、要求されたデータは、呼出し側に返されない。しかし、呼出し側プログラムが、１つまたは複数のターゲットプログラムの１つである場合には、ＵｎＳｅａｌ動作が成功し、要求されたデータが、呼出し側プログラムに返される。データを封印したプログラムのダイジェストも、任意選択として、ＵｎＳｅａｌ動作から返される。
【００４８】
ＵｎＳｅａｌ動作の擬似コードを表ＩＩに示す。表ＩＩの擬似コードでは、ｄａｔａが、要求されている（前に封印された）データを指し、［ｔ1、．．．、ｔm］が、データの検索（封印解除）を許可される１つまたは複数（ｍ個）のターゲットプログラムのダイジェスト（または、１つまたは複数の他の条件）を指し、ｅが、ＵｎＳｅａｌ動作への入力（通常は、Ｓｅａｌ動作による前の出力）を指し、ｄが、データを封印したプログラムのダイジェストを指す。
表ＩＩ
(data, [t1, ..., tm], d) = retrieve(e)
if ID() is in [t1, ..., tm] then return (data, d)
else fail
【００４９】
図４は、ＵｎＳｅａｌ動作を実施する例示的なプロセス２２０を示す流れ図である。プロセス２２０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００５０】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る（動作２２２）。呼出し側がデータの検索を許可されるかどうかを検査し（動作２２４）、呼出し側がデータの検索を許可されるかどうかに基づいて処理を進める（動作２２６）。呼出し側がデータの検索を許可される場合には、データ（暗号解読された）を呼出し側に返す（動作２２８）。呼出し側がデータの検索を許可されない場合には、処理が失敗し（動作２３０）、データは、呼出し側に返されない。
【００５１】
シールドストレージを、異なる形で実施することができる。一実施形態では、シールドストレージが、物理的に保護された不揮発性メモリを使用して実施される。この実施形態では、コンピューティングデバイスが、保護された不揮発性メモリの異なる部分に異なるガードを関連付け、各ガードが、そのガードに関連付けられた部分だけにアクセスできるようにする。この実施形態では、Ｓｅａｌ動作およびＵｎＳｅａｌ動作で参照されるＳｔｏｒｅ動作およびＲｅｔｒｉｅｖｅ動作が、コンピューティングデバイスに、ガードに関連する保護された不揮発性メモリ内のデータを、それぞれ保存させるか検索させるために呼び出される。
【００５２】
たとえば、ストレージデバイス（ハードディスクドライブなど）によって、ガードを実施することができる。ストレージデバイスに対する読取コマンドおよび書込コマンドを無条件に単純に実行するのではなく、ストレージデバイスが、そのストレージデバイスへのアクセスを試みるプリンシパルを識別し（たとえば、プリンシパルのダイジェストに基づいて）、特定のプリンシパルだけにそのストレージデバイスへのアクセスを許可する。代替案では、異なるプリンシパルを、ストレージデバイスの特定の部分（たとえば、特定のセクタまたはアドレス範囲）だけへのアクセスに制限することができる。
【００５３】
もう１つの実施形態では、シールドストレージが、暗号を使用して実施される。暗号を使用するシールドストレージの１つの例示的な実施形態の説明を続ける。
【００５４】
暗号を使用してシールドストレージを実施する場合に、リソースは、物理的に保護されるメモリではなく、鍵Ｋである。Ｓｔｏｒｅ動作では、その入力が物理的に保存されない。そうではなく、Ｓｔｏｒｅ動作では、暗号的に保護された出力ｃが作られ、この出力ｃが、暗号化され保全性を保護された形でのＳｔｏｒｅ動作の入力になる。暗号化は、入力に対称暗号を適用した結果である。後者のプロパティは、入力（入力を暗号化する前または後のいずれか）にメッセージ確認コード（ＭＡＣ）を適用することから生じる。
【００５５】
Ｓｔｏｒｅ動作の擬似コードを、表ＩＩＩに示す。表ＩＩＩの擬似コードでは、ｂが、Ｓｔｏｒｅ動作に入力されるビットストリングを指し、ｃが、Ｓｔｏｒｅ動作によって出力されるビットストリングを指し、Ｋ１が、鍵Ｋの第１部分を指し、Ｋ２が、鍵Ｋの第２部分を指す。鍵ＫはＳｅａｌ動作およびＳｔｏｒｅ動作を実施するガードの対称鍵である。
表ＩＩＩ
m = MACK1(b)
c = (m, EncryptK2(b))
return c
【００５６】
したがって、表ＩＩＩからわかるように、値（ｍ）は、Ｓｔｏｒｅ動作に入力されるビットストリングにＭＡＣを適用することによって生成される。ＭＡＣは、鍵Ｋの部分（Ｋ１）を鍵とする。また、保存動作に入力されるビットストリングは、鍵Ｋの第２部分（Ｋ２）を使用して暗号化される。入力ビットストリングにＭＡＣを適用すること、および入力ビットストリングを暗号化することによって生成された値が、Ｓｔｏｒｅ動作の呼出し側に返される。
【００５７】
鍵Ｋは、ＭＡＣと暗号に同一の鍵を使用しないようにするために、２つの独立の鍵Ｋ１およびＫ２に区分される。この区分は、さまざまな形のいずれかで実行することができる。区分では、鍵Ｋの異なるビットを使用するか、その代わりに、１つまたは複数の同一のビットを使用することができる。たとえば、鍵Ｋが１０２４ビットであると仮定すると、下位５１２ビットを鍵Ｋ１として使用し、上位５１２ビットを鍵Ｋ２として使用することができ、偶数番目のビット（ビット０、２、４、６、８、１０、．．．、１０２２）を鍵Ｋ１として使用し、奇数番目（ビット１、３、５、７、９、１１、．．．、１０２３）を鍵Ｋ２として使用することができ、下位６５０ビットを鍵Ｋ１として使用し、上位６５０ビットを鍵Ｋ２として使用することができる（いくつかのビットがＫ１およびＫ２の両方に使用されることになる）。その代わりに、同一の鍵ＫをＭＡＣおよび暗号の両方に使用することができる。
【００５８】
表ＩＩＩに示された擬似コードでは、データに対してＭＡＣを計算し、ＭＡＣを暗号化し、暗号化されたＭＡＣを出力することによって、Ｓｔｏｒｅ動作が実施される。その代わりに、Ｓｔｏｒｅ動作を異なる形で実施することができる。たとえば、Ｓｔｏｒｅ動作で、まずデータを暗号化し、次に暗号テキストに対するＭＡＣを計算し、暗号テキストおよびＭＡＣの両方を出力することができる。もう１つの例として、Ｓｔｏｒｅ動作で、データに対するＭＡＣを計算し、データおよびＭＡＣの両方を暗号化し、暗号テキストを出力することができる。
【００５９】
Ｓｔｏｒｅ動作の暗号によって実行される暗号化は、さまざまな対称暗号化アルゴリズムのいずれかを使用して実行することができる。一般に、対称暗号化アルゴリズムでは、暗号化および暗号解読の両方に同一の鍵が使用される。そのようなアルゴリズムの例に、ｔｒｉｐｌｅ−ＤＥＳ（Ｄａｔａ  Ｅｎｃｒｙｐｔｉｏｎ  Ｓｔａｎｄａｒｄ、データ暗号化規格）、ＡＥＳ（Ａｄｖａｎｃｅｄ  Ｅｎｃｒｙｐｔｉｏｎ  Ｓｔａｎｄａｒｄ）などが含まれる。
【００６０】
同様に、ＭＡＣは、さまざまなメッセージ確認コードのいずれか（たとえば、非特許文献１参照）とすることができる。代替案では、ＭＡＣの代わりに公開鍵ディジタル署名によって保全性を保護することができる。
【００６１】
図５は、Ｓｔｏｒｅ動作を実施する例示的なプロセス２５０を示す流れ図である。プロセス２５０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００６２】
まず、保存されるデータを受け取る（動作２５２）。対称暗号をデータに適用し（動作２５４）、メッセージ確認コード（ＭＡＣ）をデータに適用する（動作２５６）。動作２５４で生成された暗号化されたデータ、および動作２５６で生成されたＭＡＣ値を呼出し側に返す（動作２５８）。
【００６３】
Ｒｅｔｒｉｅｖｅ動作では、ＭＡＣ値および暗号テキストを含むビットストリングを入力として受け取る。暗号テキストを暗号解読して、平文を生成し、その平文のＭＡＣ値を生成する。平文について生成されたＭＡＣ値が、入力ビットストリングの一部として受け取ったＭＡＣ値と同一である場合には、平文を呼出し側に返す。しかし、平文について生成されたＭＡＣ値が、入力ビットストリングの一部として受け取ったＭＡＣ値と同一でない場合には、Ｒｅｔｒｉｅｖｅ動作が失敗し、平文は呼出し側に返されない。入力ビットストリングからＭＡＣおよび暗号テキストを得るためにＲｅｔｒｉｅｖｅ動作が実施される特定の形が、Ｓｔｏｒｅ動作が実施される形に依存することを諒解されたい。
【００６４】
Ｒｅｔｒｉｅｖｅ動作の擬似コードを、表ＩＶに示す。表ＩＶの擬似コードでは、ｃが、Ｒｅｔｒｉｅｖｅ動作に入力されるビットストリングを指し、ｂが、Ｒｅｔｒｉｅｖｅ動作によって出力されるビットストリングを指し、ｍが、Ｒｅｔｒｉｅｖｅ動作に入力されたビットストリングのＭＡＣ値部分を指し、ｄが、Ｒｅｔｒｉｅｖｅ動作に入力されたビットストリングの暗号テキスト部分を指し、Ｋ１が、鍵Ｋの第１部分を指し、Ｋ２が、鍵Ｋの第２部分を指す。Ｋ１鍵およびＫ２鍵は、鍵Ｋのうちで、Ｓｔｏｒｅ動作に関して上で説明した物と同一の部分である。
表ＩＶ
Let (m, d) = c
b = DecryptK2(d))
if m = MACK1(b) then return b
else fail
【００６５】
したがって、表ＩＶからわかるように、値（ｂ）は、Ｒｅｔｒｉｅｖｅ動作に入力されたビットストリングを暗号解読することによって生成される。その後、ＭＡＣ値が、値（ｂ）について生成される。Ｒｅｔｒｉｅｖｅ動作によって生成されたＭＡＣ値が、Ｒｅｔｒｉｅｖｅ動作に入力されたビットストリングの一部として受け取られたＭＡＣ値と同一である場合には、値（ｂ）をＲｅｔｒｉｅｖｅ動作の呼出し側に返し、そうでない場合には、Ｒｅｔｒｉｅｖｅ動作が失敗する。
【００６６】
表ＩＶの擬似コードは、データに対するＭＡＣを計算し、データを暗号化し、ＭＡＣおよび暗号テキストを一緒に出力する（これがＲｅｔｒｉｅｖｅ動作の入力ビットストリングとして働く）Ｓｔｏｒｅ動作の実施形態に基づく。Ｓｔｏｒｅ動作が、まずデータを暗号化し、暗号テキストに対するＭＡＣを計算し、暗号テキストおよびＭＡＣの両方を出力するように実施される場合には、Ｒｅｔｒｉｅｖｅ動作は、暗号テキストのＭＡＣを計算し、それを入力ビットストリングの一部として受け取られたＭＡＣ値と比較し、ＭＡＣ値が一致する場合に暗号テキストを暗号解読し、暗号解読されたデータを返すように実施される。Ｓｔｏｒｅ動作が、データに対するＭＡＣを計算し、データおよびＭＡＣの両方を暗号化するように実施される場合には、Ｒｅｔｒｉｅｖｅ動作は、入力ビットストリングを暗号解読し、入力ビットストリングのデータに対するＭＡＣを計算し、計算されたＭＡＣを暗号解読されたストリングのＭＡＣ値と比較し、ＭＡＣ値が一致する場合にデータを返すように実施される。
【００６７】
Ｓｔｏｒｅ動作に関する上の説明と同様に、さまざまな暗号解読アルゴリズムのどれであっても、Ｒｅｔｒｉｅｖｅ動作に使用することができる。しかし、暗号解読アルゴリズムは、暗号化されたデータを暗号解読できるようにするために、暗号化アルゴリズムに対応しなければならない。同様に、さまざまなメッセージ確認コードのどれでも、ＭＡＣとして使用することができるが、メッセージ確認コードは、Ｓｔｏｒｅ動作によって使用されるメッセージ確認コードと同一でなければならない。
【００６８】
図６は、Ｓｅａｌ動作を実施する例示的なプロセス２７０を示す流れ図である。プロセス２７０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００６９】
まず、暗号テキストおよびＭＡＣ値を受け取る（動作２７２）。暗号テキストを暗号解読して、平文データを生成する（動作２７４）。メッセージ確認コード（ＭＡＣ）を平文データに適用して、ＭＡＣ値を生成し（動作２７６）、動作２７６で生成されたＭＡＣ値が動作２７２で受け取ったＭＡＣ値と等しいかどうかを検査する（動作２７８）。その後、処理は、生成されたＭＡＣ値が受け取ったＭＡＣ値と等しいかどうかに基づいて進行する（動作２８０）。生成されたＭＡＣ値が受け取ったＭＡＣ値と等しい場合には、平文データを呼出し側に返す（動作２８２）。しかし、生成されたＭＡＣ値が受け取ったＭＡＣ値と等しくない場合には、処理が失敗し（動作２８４）、平文データは呼出し側に返されない。
【００７０】
したがって、シールドストレージに対する暗号手法では、値ｃ（Ｓｔｏｒｅ動作の出力）のすべての破壊を検出できること、および値ｂ（Ｓｔｏｒｅ動作への入力）を、鍵Ｋ２（値ｂを暗号化するために暗号によって使用される鍵）にアクセスできなければ検索できないことが、実質的に保証される。
【００７１】
ゲーティング機能のもう１つのクラスでは、リモート認証が実施される。リモート認証の目的は、認証機能への強い物理的結合（たとえばサーバまたはスマートカードを使用する）がない場合であってもプログラムを認証できるようにすることである。この状況では、認証は、暗号に基づく。すなわち、両方の実体が、暗号認証プロトコルを介して進む。これには、秘密へのアクセスを有する認証された構成が含まれ、この秘密は、プロトコルに依存するが、通常は秘密鍵または対称鍵である。さらに、コンピューティングデバイスは、この認証秘密の使用を、その使用を要求する構成（たとえば、プロセッサおよび／またはソフトウェア）の識別に結び付けることができる。したがって、認証機能は、コンピューティングデバイスならびにその上で実行されるソフトウェアの識別を確立することができる。
【００７２】
２つの動作、Ｑｕｏｔｅ動作およびＰＫＵｎｓｅａｌ動作が、公開鍵署名および秘密鍵暗号解読のめいめいのゲーティング機能である。これらのゲーティング機能を実施するガードは、署名鍵Ｋｓおよび暗号解読鍵Ｋｄにアクセスできる。署名鍵Ｋｓおよび暗号解読鍵Ｋｄの両方を、公開／秘密鍵対の秘密鍵とも称する。この公開／秘密鍵対は、Ｑｕｏｔｅ動作およびＰＫＵｎｓｅａｌ動作を実施するガードの鍵対である。
【００７３】
Ｑｕｏｔｅ動作は、Ｑｕｏｔｅ動作への入力、および秘密を明かすことができる場合および／または相手を識別する条件の組合せ（たとえば連結）に対する公開鍵署名を返す。上で説明したＳｅａｌ動作およびＵｎＳｅａｌ動作に似て、秘密を明かすことを、さまざまな条件のどれにでも結び付けることができる。一実施形態では、条件が、呼出し側プログラムの識別子（たとえばダイジェスト）である。
【００７４】
署名に固有なのが、動作が、識別される呼出し側プログラムの要求で実行されるという断定である。Ｑｕｏｔｅ動作は、Ｖｅｒｉｆｙ動作と共に働き、Ｖｅｒｉｆｙ動作は、通常は、Ｑｕｏｔｅ動作が実行されるデバイス以外のデバイスで（たとえば、リモートサーバデバイスで、スマートカードでなど）実行される。Ｖｅｒｉｆｙ動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子（および／または秘密を明かす他の条件）を検索し、評価する。
【００７５】
Ｑｕｏｔｅ動作の擬似コードを、表Ｖに示す。表Ｖの擬似コードでは、ＩＤ（）が、上で説明したＩＤ（）関数を指し、ａが、Ｑｕｏｔｅ動作に入力されるデータを表し、Ｋｓが、署名鍵を指す。
表Ｖ
d =ID()
return sn=SignatureKs(d, a)
【００７６】
したがって、表Ｖからわかるように、Ｑｕｏｔｅ動作では、呼出し側プログラムのダイジェストを入手し、入力値ａを受け取る。Ｑｕｏｔｅ動作では、入力値ａおよび呼出し側プログラムのダイジェストの、署名鍵Ｋｓを使用するディジタル署名（ｓｎ）を生成する。入力値ａは、呼出し側プログラムが生成することができ、その代わりに、別のコンポーネントまたはデバイスから（たとえば、Ｖｅｒｉｆｙ動作を実行するデバイスから）受け取られる値とすることができる。ディジタル署名は、公開鍵暗号を使用して生成される。
【００７７】
図７は、Ｑｕｏｔｅ動作を実施する例示的なプロセス３００を示す流れ図である。プロセス３００は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００７８】
まず、入力データを呼出し側から受け取る（動作３０２）。呼出し側の識別子（および／または入力データの検索に関する１つまたは複数の他の条件）を入手し（動作３０４）、入力データおよび呼出し側の識別子（および／または１つまたは複数の他の条件）の組合せに対するディジタル署名を生成する（動作３０６）。その後、生成されたディジタル署名を呼出し側に返す（動作３０８）。
【００７９】
Ｖｅｒｉｆｙ動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子を検索し、評価する。Ｖｅｒｉｆｙ動作では、通常はＶｅｒｉｆｙ動作が実行されるデバイス以外のデバイス（たとえば、リモートサーバデバイス、スマートカードなど）から、Ｑｕｏｔｅ動作によって生成されたディジタル署名を受け取る。Ｖｅｒｉｆｙ動作では、受け取ったディジタル署名から、Ｑｕｏｔｅ動作を呼び出したプログラム（たとえば、アプリケーションプログラム、オペレーティングシステム、ファームウェアプログラムなど）のダイジェストを抽出し、そのダイジェストを評価して、進行方法を決定する。
【００８０】
Ｖｅｒｉｆｙ動作の擬似コードを、表ＶＩに示す。表ＶＩの擬似コードでは、ｄが、Ｑｕｏｔｅ動作を呼び出したプログラムのダイジェストを指し、ａが、Ｑｕｏｔｅ動作に入力された値を指し、Ｓｎが、Ｖｅｒｉｆｙ動作によって入力として受け取られたディジタル署名を指す。
表ＶＩ
(d,a)=ExtractKv(Sn)
Evaluate(d)
【００８１】
したがって、表ＶＩからわかるように、Ｖｅｒｉｆｙ動作では、ディジタル署名を受け取り、検証鍵Ｋｖ（署名鍵Ｋｓを含む公開／秘密鍵対の公開鍵）を使用して、署名からダイジェストｄおよび値ａを抽出する。その後、Ｖｅｒｉｆｙプログラムでは、Ｑｕｏｔｅ動作を呼び出したプログラムのダイジェストｄを評価することができる。ダイジェストｄを評価する形は、変更することができる。たとえば、評価に、ダイジェストｄを、「承認された」または「信頼される」アプリケーションプログラムのリストと比較することを含めることができる。
【００８２】
図８は、Ｖｅｒｉｆｙ動作を実施する例示的なプロセス３２０を示す流れ図である。プロセス３２０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００８３】
まず、ディジタル署名を受け取る（動作３２２）。入力値を引用した（Ｑｕｏｔｅ動作を使用した）呼出し側の識別子（および／または入力値の検索に関する１つまたは複数の他の条件）および入力値自体の両方を、ディジタル署名から抽出する（動作３２４）。呼出し側の識別子（および／または１つまたは複数の他の条件）を評価して、入力値に関して進行する方法を決定する（動作３２６）。
【００８４】
ＰＫＵｎｓｅａｌ動作は、公開鍵暗号解読の、呼出し側の識別（たとえば呼出し側プログラムのダイジェスト）またはその代わりに１つまたは複数の他の条件に対してゲーティングされる版である。ＰＫＵｎｓｅａｌ動作への入力ｃの公開鍵暗号解読の結果は、対（ｄ、ｓ）として解釈され、ここで、ｓは、秘密であり、ｄは、それに対してｓを明かすことができる構成（たとえば、呼出し側プログラムのダイジェスト）を識別する。ＰＫＵｎｓｅａｌの呼出し側が、ｄでない場合には、ＰＫＵｎｓｅａｌ動作が失敗する。ＰＫＵｎｓｅａｌ動作への入力ｃは、ＰＫＵｎｓｅａｌ動作が実行されるデバイス以外のデバイス（たとえば、リモートサーバデバイス、スマートカードなど）で実行することができる第２の動作ＰＫＳｅａｌによって生成される。ＰＫＳｅａｌ動作では、対（ｄ、ｓ）の公開鍵暗号化を実行する。ＰＫＵｎｓｅａｌ動作およびＰＫＳｅａｌ動作は、シールドストレージの実施にも使用することができる。
【００８５】
ＰＫＵｎｓｅａｌ動作の擬似コードを、表ＶＩＩに示す。表ＶＩＩの擬似コードでは、ＩＤ（）が、上で説明したＩＤ（）関数を指し、ｃが、ＰＫＵｎｓｅａｌ動作への入力を指し、［ｄ１、．．．、ｄm］が、それに対してｓを明かすことができる１つまたは複数の呼出し側プログラムのダイジェスト（または、その代わりに１つまたは複数の他の条件）を指し、ｓが、保護されたデータを指し、Ｋｄが、暗号解読鍵（ＰＫＵｎｓｅａｌ動作を実施するガードに関連する公開／秘密鍵対の秘密鍵）を指す。
表ＶＩＩ
([d1, ..., dm], s) = DecryptKd(c)
if ID() is in [d1, ..., dm] then return s
else fail
【００８６】
したがって、表ＶＩＩからわかるように、ＰＫＵｎｓｅａｌ動作では、公開鍵暗号解読および暗号解読鍵Ｋｄを使用して入力値ｃを暗号解読する。暗号解読された入力値には、保護されたデータｓがそれに明かされることを許可される１つまたは複数の呼出し側プログラムのダイジェスト［ｄ１、．．．、ｄm］（または、その代わりに保護されたデータｓを明かすことが許可される場合および／または相手を識別する１つまたは複数の条件）が含まれる。ＰＫＵｎｓｅａｌ動作では、呼出し側プログラムのダイジェストも生成される。呼出し側プログラムのダイジェストが、ダイジェスト［ｄ１、．．．、ｄm］の１つと等しい場合には、保護されたデータｓが、呼出し側プログラムに返される。しかし、呼出し側プログラムのダイジェストが、ダイジェスト［ｄ１、．．．、ｄm］のどれとも等しくない場合には、保護されたデータｓは、呼出し側プログラムに返されない。
【００８７】
図９は、ＰＫＵｎｓｅａｌ動作を実施する例示的なプロセス３４０を示す流れ図である。プロセス３４０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００８８】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る（動作３４２）。呼出し側がそのデータの検索を許可されるかどうかに関する検査を行い（動作３４４）、呼出し側がそのデータの検索を許可されるかどうかに基づいて処理を進める（動作３４６）。呼出し側がそのデータの検索を許可される場合には、データ（公開鍵暗号解読を使用して暗号解読された）を呼出し側に返す（動作３４８）。呼出し側がそのデータの検索を許可されない場合には、処理が失敗し（動作３５０）、データは、呼出し側に返されない。
【００８９】
ＰＫＳｅａｌ動作は、公開鍵暗号化の、呼出し側の識別（たとえば、呼出し側プログラムあるいは１つまたは複数の他のプログラムのダイジェスト）に基づいてゲーティングされる版である。ＰＫＳｅａｌ動作では、対（ｄ、ｓ）の公開鍵暗号化を実行し、ここで、ｓは、秘密であり、ｄは、それに対してｓを明かすことができる１つまたは複数の構成（たとえば、呼出し側プログラムのダイジェスト）を識別する。
【００９０】
ＰＫＳｅａｌ動作の擬似コードを、表ＶＩＩＩに示す。表ＶＩＩＩの擬似コードでは、ｃが、ＰＫＳｅａｌ動作の出力を指し、［ｄ１、．．．、ｄm］が、それに対してｓを明かすことができる１つまたは複数の呼出し側プログラムのダイジェストを指し、ｓが、保護されたデータを指し、Ｋｅが、暗号化鍵を指す。
表ＶＩＩＩ
c=EncryptKe([d1, ..., dm], s)
return c
【００９１】
したがって、表ＶＩＩＩからわかるように、ＰＫＳｅａｌ動作では、入力として、保護されたデータｓ、および保護されたデータｓをそれに対して明かすことができる１つまたは複数のプログラムのダイジェスト［ｄ１、．．．、ｄm］を受け取る。対［ｄ１、．．．、ｄm］、ｓを、暗号化鍵Ｋｅに基づく公開鍵暗号を使用して暗号化する。暗号化鍵Ｋｅは、暗号テキストを暗号解読できることが意図されたガードの公開鍵である。公開鍵暗号化から生じる暗号テキストを、呼出し側プログラムに返す。
【００９２】
図１０は、ＰＫＳｅａｌ動作を実施する例示的なプロセス３６０を示す流れ図である。プロセス３６０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００９３】
まず、封印する秘密を呼出し側から受け取る（動作３６２）。秘密を公開鍵暗号化を使用して暗号化し、その結果、特定のターゲットプログラムだけが秘密を検索できるようにするか（動作３６４）、その代わりに、１つまたは複数の他の条件が満たされる場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す（動作３６６）。呼出し側のダイジェストおよび／またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる（暗号テキストの一部としてまたは暗号テキストと別に）。
【００９４】
Ｑｕｏｔｅ動作およびＰＫＵｎｓｅａｌ動作は、公開鍵認証プロトコルと共に使用されることを意図されている。ほとんどの公開鍵認証プロトコルは、公開鍵暗号解読、公開鍵暗号化、署名、および署名検証への呼出しのすべてを、それぞれＰＫＵｎｓｅａｌ、ＰＫＳｅａｌ、Ｑｕｏｔｅ、およびＶｅｒｉｆｙに置換することによって簡単に適合させることができる。
【００９５】
いくつかの状況で、乱数を得られることが重要である（たとえば、暗号鍵生成の基礎として）。乱数は、さまざまな異なる形で得ることができる。一実施形態では、乱数の供給源が、コンピューティングデバイスのハードウェアで実施される、暗号的に強い乱数ジェネレータである。
【００９６】
上で説明したＳｅａｌ動作の代替案の１つが、Ｓｅａｌ動作を乱数生成動作と組み合わせたＧｅｎＳｅａｌ動作である。ＧｅｎＳｅａｌ動作では、入力として、秘密を検索することができなければならないターゲットプログラムのダイジェスト［ｔ１、．．．、ｔm］（および／または秘密を検索するために満足されなければならない他の条件）を受け取る。ＧｅｎＳｅａｌ動作では、乱数を生成し、新たに生成された乱数を封印し、その結果、新たに生成された乱数を、ターゲットダイジェスト［ｔ１、．．．、ｔm］（および／または満足される他の条件）の１つを有する呼出し側プログラムだけが検索できるようにする。
【００９７】
ＧｅｎＳｅａｌ動作の擬似コードを、表ＩＸに示す。表ＩＸの擬似コードでは、ＩＤ（）が、上で説明したＩＤ（）関数を指し、ｃが、ＧｅｎＳｅａｌ動作の出力を指し、ｓが、新たに生成される乱数を指し、［ｔ１、．．．、ｔm］が、値ｓを検索することが許可されなければならない１つまたは複数のターゲットプログラム（そのうちの１つを、任意選択として、ＧｅｎＳｅａｌ動作を呼び出すプログラムにすることができる）あるいはその代わりに１つまたは複数の他の条件を指し、ＧｅｎＲａｎｄｏｍ（）が、乱数を生成する関数を指す。
表ＩＸ
d =ID()
s =GenRandom()
c = store (s, [t1, ..., tm], d)
return c
【００９８】
図１１は、ＧｅｎＳｅａｌ動作を実施する例示的なプロセス３８０を示す流れ図である。プロセス３８０は、図１のガード１０４によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【００９９】
まず、秘密を検索できなければならないターゲットプログラムまたはその代わりに秘密を検索するために満足されなければならない１つまたは他の条件を識別する入力を呼出し側から受け取る（動作３８２）。秘密を生成し（動作３８４）、秘密を暗号化し、その結果、識別されたターゲットプログラムだけが秘密を検索できるようにする（動作３８６）か、その代わりに１つまたは他の条件が満足される場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す（動作３８８）。呼出し側のダイジェストおよび／またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる（暗号テキストの一部としてまたは暗号テキストと別に）。
【０１００】
開示ガードによって供給されるサービスを、汎用封印サービスに使用することができる。たとえば、図１および２に戻ると、層ｎ−１によって、初期化の際の（たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり）層ｎの識別に基づいて、層ｎに単一の鍵が開かされる。層ｎは、この鍵をキャッシュに入れ、これを使用して追加の秘密を暗号化する。このプラットフォームが同一の構成で次にブートされる時に、開示ガードが、同一のルート鍵を供給し（たとえば、ＵｎＳｅａｌまたはＰＫＵｎｓｅａｌを介して）、前に暗号化されたすべての秘密を、層ｎによって検索できる。
【０１０１】
いくつかの実施形態で、次の層が初期化される時（たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり）に、その、次の層に、下位の層によって１つまたは複数の秘密が開示される。このゲーティングされる開示の後に、下位の層は、もはや使用されなくなる（次のブートまたはリセットまで）。この使用モデルを、開示ガードモデルとも称する。開示ガードモデルを使用することによって、下位層へのアクセスが減る。
【０１０２】
本明細書で説明するゲーティング機能は、時間分離および空間分離を使用して実施されるサービスガードおよび開示ガードと共に使用することができる。認証動作に関する４つのサービスモデル実施形態すなわち、（１）サービスガード−空間分離、（２）開示ガード−空間分離、（３）開示ガード−時間分離、および（４）サービスガード−時間分離を下で説明する。これらのサービスモデルの説明では、下位ガードが、検討される層のガードに１つまたは複数の鍵を開示したと仮定する。これらの鍵を入手する形は、下の層のガードおよび分離のモデルに依存する。同一のコンピューティングデバイスの異なる層で、これらのサービスモデルの異なる１つを使用することができる。
【０１０３】
（１）サービスガード−空間分離：ガードが、初期化される場合に要求元プログラムの識別を測定し、保存する。ガードは、プロセッササービス（たとえばＣＰＵあるいは他のセキュリティプロセッサまたはセキュリティコプロセッサの）を使用する保護システム、および認証された動作プリミティブ動作を公開するシステム呼出しインターフェースを実施する。
【０１０４】
（２）開示ガード−空間分離：ガードが、暗号ｂｌｏｂの形で初期化時にサービス要求を得る。ｂｌｏｂは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、それ自体およびそれの秘密リソースに関するモード−保護を確立する。
【０１０５】
（３）開示ガード−時間分離：ガードが、暗号ｂｌｏｂ（ビットのグループ）の形で初期化時にサービス要求を得る。ｂｌｏｂは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、ゲーティング機能を実施するのに使用される鍵を削除（または他の形でアクセス不能に）する。
【０１０６】
（４）サービスガード−時間分離：サービスガード−時間分離モデルでは、コンピューティングデバイスが、セキュリティリセットにまたがって、プログラム状態を安全に保存する。このモデルは、モデル（１）（サービスガード−空間分離）に類似するが、制御を次の層に渡す前に、サービスガードが、その秘密を削除する（次のリブートまで機能しないようにする）。次の層は、ガードにサービスを要求する必要が生じるまで、普通に実行される。必要になった時点で、次の層は、要求のパラメータを、メモリのうちでリセットに耐える場所に保存し、リセットを実行する。デバイスがリブートする際に、サービスガードが、その秘密を入手し、要求を見、それを実行し（鍵を使用して）、鍵および関連する情報を破壊し、計算の結果および制御を次の層（最初にサービスを要求した層）に渡す。
【０１０７】
いくつかの実施形態で、コンピューティングデバイスが、空間分離をサポートする場合に、セキュリティカーネルが、プリミティブ（動作）Ｓｅａｌ、Ｕｎｓｅａｌ、ＧｅｔＲａｎｄｏｍ（乱数を得るため）、およびＰＫＵｎｓｅａｌ（またはＱｕｏｔｅ）を公開しなければならない。セキュリティカーネルで、開示ガードまたはサービスガードを実施することができる。その一方で、プラットフォームが時間分離をサポートする場合に、セキュリティカーネルが、開示ガードを提供しなければならず、プリミティブ（動作）Ｕｎｓｅａｌ、ＧｅｎＳｅａｌ、およびＰＫＵｎｓｅａｌ（またはＱｕｏｔｅ）を実施しなければならない。
【０１０８】
ＱｕｏｔｅおよびＰＫＵｎｓｅａｌの機能性を、ＳｅａｌプリミティブおよびＵｎｓｅａｌプリミティブまたはＵｎｓｅａｌプリミティブおよびＧｅｎＳｅａｌプリミティブに基づいて構築できることにも留意されたい。たとえば、製造業者は、ＱｕｏｔｅまたはＰＫＵｎｓｅａｌを実施し、ｌ1で実施されるＧｅｎＳｅａｌおよびＵｎｓｅａｌに基づく上位ソフトウェア（たとえばオペレーティングシステム）のホストとして働くｌ2プログラムを構築することができる。製造業者は、サービス層が必要とする鍵を生成し、Ｓｅａｌし、デバイスまたはＣＰＵと共に出荷する（またはオンラインで使用可能にする）ことができる。
【０１０９】
プラットフォームが認証された動作をサポートできるようにする、ハードウェア実施形態の系列の例示的な説明を続ける。システムの上位層と同様に、下位層（図２のｌ1）の特性は、（ａ）秘密の鍵リソース、（ｂ）これらの鍵にアクセスできる特権コード、および（ｃ）層の制御された初期化である。
【０１１０】
認証される動作によって、プログラムと秘密の鍵の間の強い束縛が提供される。上位層では、下位層のガードによって、この束縛が保証される。下位層では、プラットフォームの秘密へのアクセスをゲーティングできる、基礎となるソフトウェアガードがない。したがって、ｌ1プログラムへのｌ1鍵の関連付けをサポートするために、別の機構が使用される。この束縛を達成する方法の１つが、ｌ1ソフトウェアを、製造後に変更できないプラットフォームマイクロコードまたはファームウェアにし、ｌ1ソフトウェアに、ｌ1鍵への制限されないアクセスを与えることである。このプラットフォームマイクロコードまたはファームウェアを、セキュリティカーネルと呼ぶことができ、ｌ1鍵を、プラットフォーム鍵と称する。プラットフォームは、所定のセキュリティカーネルだけに制御を渡すように設計される。このハードウェア挙動を、プラットフォーム鍵を事前定義のセキュリティカーネルに開示する単純なリソースガードと説明することもできる。
【０１１１】
プラットフォーム鍵およびセキュリティカーネルファームウェアは、プロセッサの一部とするか、その代わりに、コンピューティングデバイスの１つまたは複数の他のコンポーネント（たとえば、暗号動作も実行できるセキュリティプロセッサまたはセキュリティコプロセッサ）で実施することができる。プラットフォーム鍵およびセキュリティカーネルファームウェアは、単一のコンポーネントで実施するか、その代わりにコンピューティングデバイスの複数のコンポーネントで実施することができる。
【０１１２】
認証された動作を用いると、プログラムが、制御された初期状態で開始される。上位レベルでは、下位レベルで動作するソフトウェアを信頼して、正しいエントリポイントで実行を開始することができる。しかし、ｌ1では、ハードウェアがこの機能を実行する。通常、電源投入時またはリセットの後に、現在のプロセッサは、ある決定論的なシーケンスに従うことによって実行を開始する。たとえば、最も単純な場合に、プロセッサは、アーキテクチャ的に定義されたメモリ位置からコードをフェッチし、実行する。ｌ1について、セキュリティカーネルがスタートアップ時に実行されるコードである（決定論的シーケンスの一部として）ことをハードウェアが保証することによって、プログラムを、制御された初期状態で開始することができる。
【０１１３】
さらに、他のプラットフォーム状態によって、セキュリティカーネルの実行を破壊できてはならない。リセットおよび電源投入によって、堅牢で確実にデバッグされた状態がプロセッサに明瞭にされなければならない。この例で使用される際に、セキュリティカーネルの開始または呼出しに使用されるプラットフォーム状態変化を、セキュリティリセットと称する。
【０１１４】
さらに、デバイス製造業者は、ＳｅａｌおよびＵｎｓｅａｌのｌ1実装によって使用されるプラットフォーム鍵の生成またはインストールを配置しなければならない。デバイスが、ＰＫＩ（公開鍵インフラストラクチャ）の一部として認識されなければならない場合には、製造業者は、プラットフォームの公開鍵の証明も行わなければならない。これは、ｌ1によって直接に使用されるプラットフォーム鍵とするか、その代わりに上位層によって使用される鍵とすることができる。
【０１１５】
鍵の生成および証明は、ＣＰＵ製造業者の責任とするか、その代わりにＣＰＵをデバイスに組み立てるＯＥＭなどの第三者の責任とすることができる。その代わりに、この責任を、複数のそのような当事者が共有することができる。
【０１１６】
セキュリティカーネルが実行されているならば、そのセキュリティカーネルが、上で説明した分離機構を使用して、上位層で実行されるコードからそれ自体を保護することができる。空間における分離には、通常は、特権モードサポートが含まれ、時間における分離には、通常は、上位層から隠される秘密が含まれる。
【０１１７】
ほとんどの現在のプロセッサでは、空間分離をサポートするための追加のプラットフォームサポートは不要である。すなわち、既存の特権モードまたはレベルで十分である（プラットフォーム鍵へのアクセスを許可するハードウェアリソースを上位層から保護できる限り）。
【０１１８】
時間分離をサポートするために、ハードウェアの援助を使用して、セキュリティカーネルが、上位層に制御を渡す前にプラットフォーム鍵を隠せるようにする。時間分離モデルでプラットフォーム鍵セキュリティを提供する形の１つが、リセットラッチと称するステートフルガード回路を使用することである。リセットラッチは、リセットまたは電源投入の後に開かれるが、いつでもどのソフトウェアでもこのラッチをプログラム的に閉じることができるというプロパティを有するハードウェア回路である。閉じられたならば、ラッチは、次のリセットまたは電源投入まで閉じられたままになる。時間分離されるセキュリティカーネルを実施するプラットフォームは、リセットラッチの状態に基づいてプラットフォーム鍵アクセスをゲーティングしなければならず、セキュリティカーネルは、上位層に制御を渡す前にこのラッチを閉じなければならない。上で説明したように、セキュリティカーネルは、制御を渡す前に、メモリおよびレジスタのクリアなどの追加処理も講じなければならないが、これらの処理は、上位層で使用される物と同一である。
【０１１９】
プラットフォームで、空間分離が使用される場合には、セキュリティカーネルで、特権モードを使用して、それ自体およびそのプラットフォーム鍵を、セキュリティカーネルがホストするプログラム（たとえばオペレーティングシステム）から保護する。さらに、セキュリティカーネルは、認証動作の呼出しに関するシステム呼出しインターフェースを確立する。
【０１２０】
プラットフォームで、空間分離が使用される場合には、そのプラットフォームに、サービスルーチンにパラメータを渡すためにセキュリティリセットの後まで残されるストレージも含まれなければならない。サービスを呼び出すために、オペレーティングシステムは、セキュリティカーネルに既知のメモリ位置にコマンドおよびパラメータブロックを準備し、セキュリティリセットを実行する。ＯＳが、サービス呼出しの後に実行を継続する（単純な再始動ではなく）ことを望む場合には、ＯＳおよびセキュリティカーネルが、これを信頼性があり安全な形で行えることを保証するために余分な処理を講じなければならない。
【０１２１】
本明細書で説明する認証された動作は、ウィルスからの個人データの保護、ネットワーク攻撃からの機密サーバデータの保護、ネットワーク管理、コピープロテクト、信頼性のある分散コンピューティングなど、さまざまな設定でセキュリティに使用することができる。認証される動作を用いると、特定の信頼関係でなしに同一のコンピュータで実行できる異なるプログラムが、他のソフトウェアの処理に無関係にその暗号リソースを保存できるようになる。
【０１２２】
下の説明の一部で、ＳＳＰ（Ｓｅｃｕｒｅ  Ｓｅｒｖｉｃｅ  Ｐｒｏｃｅｓｓｏｒ、セキュアサービスプロセッサ）に言及する。一実施形態では、ＳＳＰが、コンピューティングデバイスに基本的な暗号サービスを提供するプロセッサ（コンピューティングデバイス内で使用するための）である（たとえば、ＳＳＰが、本明細書で説明するゲーティング機能（たとえば図２の層ｌ1）をサポートする）。ＳＳＰは、暗号鍵を利用することができ、通常は、そのＳＳＰに一意の（または一意であると期待される）１つまたは複数の暗号鍵を有する。ＳＳＰは、デバイスのＣＰＵの一部とするか、その代わりに１つまたは複数の他のプロセッサとすることができる。たとえば、ＳＳＰを、コンピューティングデバイス内の別のチップまたは集積回路（ＩＣ）とすることができる。
【０１２３】
異なる実施形態では、ＳＳＰが、前の実施形態と同一の機能性を呼出し側に公開する、適当に分離されたソフトウェアプログラムである。このＳＳＰ実施形態は、暗号鍵へのアクセス（直接にまたは間接的に）を有する。そのようなアクセスの提供に関して、複数の実施形態のオプションが存在する。たとえば、ＳＳＰから、下位層のサービスガードまたは開示ガードを呼び出すことができる。あるいは、ＳＳＰが、永続メモリ（たとえば、ハードディスク、フラッシュメモリ、ＲＯＭなど）のうちで必要な暗号鍵を含む部分への排他的なアクセスを有することができる。
【０１２４】
要約すると、ＳＳＰは、それが上位のプリンシパルに公開する機能性によって定義される。ＳＳＰは、暗号鍵へのアクセス（直接のまたは間接的な）を有するガード（上で説明した）である。ＳＳＰでは、これらの鍵を使用して、呼出し側に暗号サービスを提供する。以下の節では、ＳＳＰが公開する例示的な機能性を説明する。
【０１２５】
例示的な動作
下記は、シールドストレージ動作の例示的実施形態およびリモート認証動作の説明である。この節では、上で説明したＳｅａｌ動作、ＵｎＳｅａｌ動作、Ｑｕｏｔｅ動作、およびＰＫＵｎｓｅａｌ動作の例の実施形態を説明する。
【０１２６】
この節では、下記の定義を使用する。
【０１２７】
【表１】
2010170570.tif 000003
【０１２８】
さらに、この節および下の束縛鍵動作の節で、アクセスポリシに言及する。アクセスポリシによって、特定の動作が機能する（すなわち、それが動作する）場合が記述される。コンピューティングデバイスのユーザは、ある機能を選択的にオフに切り替えることができる。たとえば、コンピューティングデバイス（たとえばＳｅａｌ動作を実施するＳＳＰ）に、ＦｅａｔｕｒｅＥｎａｂｌｅと称するレジスタが含まれる。このレジスタのビットの１つを、ＭａｉｎＥｎａｂｌｅと称する。ユーザが、ＭａｉｎＥｎａｂｌｅに偽をセットする場合に、この節の機能のどれもが、動作しなくなる。各関数に含まれるアクセスポリシの説明によって、どのＦｅａｔｕｒｅＥｎａｂｌｅ設定の下でその関数が動作するかが記述される。
【０１２９】
Ｓｅａｌ
定義
SSP_STATUS Seal (
[in] SECRET  S,
[in] DIGEST  Target[2],
[in] UINT32  MaxLen,
[out] UINT32*  ActualLen,
[out] BYTE*  SealedBlob
【０１３０】
パラメータ
Seal-Input ::=     SEQUENCE {
ordinal      INTEGER,
secret       Secret,
target       DigestPair }
Seal-Output ::=    SEQUENCE {
ordinal      INTEGER,
status       INTEGER,
sealed-blob  OCTET STRING }
【０１３１】
戻り値
SSP_SUCCESS
【０１３２】
コメント
Ｓｅａｌ動作は、下記の評価が真の場合に、対応するＵｎｓｅａｌ動作によってのみ暗号解読できる暗号化されたｂｌｏｂ（ビットのグループ）を形成する。  ・符号化が正しいか
・ＭＡＣが正しいか
・現在動作しているＳＫ／ＳＬ（セキュリティカーネルまたはセキュアローダー）が、Ｓｅａｌ動作中にターゲットとして名前を指定された物であるか
【０１３３】
Ｓｅａｌでは、内部のランダムさを追加し、その結果、同一の入力に対するＳｅａｌ動作の出力が、異なる結果を生じるようにする。これによって、Ｓｅａｌをハードウェアデバイス識別子として使用できないことが保証される。Ｓｅａｌには、開封する物に保全性情報を提供するように封印が実行された場合に、Ｓｅａｌ動作を呼び出したプログラムの識別子（たとえば、本明細書でＰＣＲ値とも称する、ＳＳＰのＰＣＲレジスタに保存された、呼出し側プログラムのダイジェスト）も含まれる。
【０１３４】
アクセスポリシ
Allowed = FeatureEnable.MainEnable & 
(FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【０１３５】
処理
Ｓｅａｌ動作では、下記の処理が実施される。  
１．１２８ビットの乱数Ｒを生成する
２．Ｄ０が、ＰＣＲ［０］の現在の値になるようにし、Ｄ１＝ＰＣＲ［１］にする
３．ダイジェストＭ＝ＨＭＡＣ［ＫM］（Ｒ‖Ｓ‖ｔａｒｇｅｔ‖Ｄ０‖Ｄ１）
４．Ｃ＝ＡＥＳ［ＫS］（Ｒ‖Ｓ‖Ｔａｒｇｅｔ‖Ｄ０‖Ｄ１‖Ｍ）
５．ＳｅａｌｅｄＢｌｏｂにＣをセットしてＳＳＰ＿ＳＵＣＣＥＳＳを返す
【０１３６】
Ｕｎｓｅａｌ
定義
SSP_STATUS Unseal (
[in] BYTE*  SealedBlob,
[in] UINT32  SealedBlobLen,
[out] SECRET  S,
[out] DIGEST  Source
)
【０１３７】
パラメータ
Unseal-Input ::=   SEQUENCE {
ordinal      INTEGER,
sealed-blob  OCTET STRING }
Unseal-Output ::=  SEQUENCE {
ordinal      INTEGER,
status       INTEGER,
secret       Secret,
source      Digest }
【０１３８】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
【０１３９】
コメント
Ｕｎｓｅａｌ動作では、Ｓｅａｌ動作によって生成されたｂｌｏｂを内部で暗号解読し、下記の条件を検査する。  
・符号化が正しいか
・ＰＣＲの現在の値が、Ｓｅａｌ動作中にターゲットとして名前を指定された物であるか
【０１４０】
すべての検査に成功する場合に、ｓｅｃｒｅｔおよび封印した物のＰＣＲを返し、そうでない場合にはＵＮＳＥＡＬ＿ＥＲＲＯＲを返す。
【０１４１】
アクセスポリシ
Allowed = FeatureEnable.MainEnable & 
(FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【０１４２】
処理
Ｕｎｓｅａｌ動作では、下記の処理を実施する。  
１．Ｍ＝ＡＥＳ−１［ＫS］（ＳｅａｌｅｄＢｌｏｂ）。  
２．Ｍを（ＢＩＴＳ［１２８］  Ｒ‖ＳＥＣＲＥＴ  Ｓ１‖ＤＩＧＥＳＴ  Ｔａｒｇｅｔ０‖ＤＩＧＥＳＴ  Ｔａｒｇｅｔ１‖ＤＩＧＥＳＴ  Ｓｅａｌｅｒ０‖ＤＩＧＥＳＴ  Ｓｅａｌｅｒ１‖ＤＩＧＥＳＴ  Ｎ）として解釈する。  
３．ダイジェストＤ＝ＨＭＡＣ［ＫM］（Ｒ‖Ｓ１‖Ｔａｒｇｅｔ０‖Ｔａｒｇｅｔ１‖Ｓｅａｌｅｒ０‖Ｓｅａｌｅｒ１）。  
４．（Ｔａｒｇｅｔ０！＝ＰＣＲ［０］‖Ｔａｒｇｅｔ１！＝ＰＣＲ［１］）の場合に、Ｓ、Ｓｏｕｒｃｅに０をセットしてＳＳＰ＿ＵＮＳＥＡＬ＿ＥＲＲＯＲを返す。  
５．Ｄ！＝Ｎの場合に、Ｓ、Ｓｏｕｒｃｅに０をセットしてＳＳＰ＿ＵＮＳＥＡＬ＿ＥＲＲＯＲを返す。  
６．そうでない場合に、ＳにＳ１、Ｓｏｕｒｃｅに｛Ｓｅａｌｅｒ０、Ｓｅａｌｅｒ１｝をセットしてＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０１４３】
Ｑｕｏｔｅ
定義
SSP_STATUS Quote (
[in] BITSTRING d-ext,
[out] PKSignature SigBlob
)
【０１４４】
パラメータ
Quote-Input ::= {
ordinal     INTEGER,
d-ext       Digest }
Quote-output ::= {
ordinal      INTEGER,
status       INTEGER,
sig-blob     PKSignature }
【０１４５】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
【０１４６】
コメント
Ｑｕｏｔｅ動作では、ＳＳＰに、外部から供給されるＤ−ＥＸＴおよび内部のＰＣＲ値の連結に署名するように指示する。
【０１４７】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０１４８】
処理
Ｑｕｏｔｅ動作では、下記の処理を実施する。  
１．ＳＳＰは、ＤＥＲ（Ｄｉｓｔｉｎｇｕｉｓｈｅｄ  Ｅｎｃｏｄｉｎｇ  Ｒｕｌｅｓ）符号化の下で、メッセージ型ＱｕｏｔｅＭｅｓｓａｇｅの識別子Ｄ−ＥＸＴおよびＰＣＲレジスタの内容の連結からなるメッセージＭを形成する。
SEQUENCE {
message-typePKMessageType,
d-ext          Digest,
pcr            DigestPair
}
【０１４９】
２．ＳＳＰが、ＫQ、ＰＲＩＶを使用して、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＳＳＡ−ＰＳＳ−ＳＩＧＮのデフォルト実装に従って、Ｍに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、ＳｉｇＢｌｏｂに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０１５０】
３．ＳＳＰが、ＳＳＰ＿ＳＵＣＣＥＳＳおよび計算されたばかりの署名値を、ＳｉｇＢｌｏｂのｓｉｇｎａｔｕｒｅＡｌｇｏｒｉｔｈｍ＝ｒＳＡＳＳＡ−ＰＳＳ−Ｄｅｆａｕｌｔ−Ｉｄｅｎｔｉｆｉｅｒと共に返す。
【０１５１】
ＰＫＵｎｓｅａｌ
定義
SSP_STATUS PK_Unseal (
[in] PKCiphertext     SealedBlob,
[out] SECRET          Secret
)
【０１５２】
パラメータ
PkUnseal-Input ::= {
ordinal          INTEGER,
pk-sealed-blob   PKCiphertext }
PkUnseal-output ::= {
ordinal         INTEGER,
status          INTEGER,
secret          Secret }
【０１５３】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【０１５４】
コメント
ＰＫＵｎｓｅａｌ動作は、長さ４１６ビットで特定のフォーマットの暗号化されたｂｌｏｂをとる。ｂｌｏｂを暗号解読し、暗号解読および復号が成功の場合には、４１６ビットメッセージを、秘密値および暗号解読された値を受け取ることを許可されるＰＣＲ値の連結として解釈する。
【０１５５】
現在のＰＣＲ値が、暗号化されたｂｌｏｂで指定される物と等しい場合に、秘密を明かし、そうでない場合には、エラーを返す。
【０１５６】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０１５７】
処理
ＰＫＵｎｓｅａｌ動作では、下記の処理を実施する。  
１．ＳＳＰが、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂのＡｌｇｏｒｉｔｈｍＩｄｅｎｔｉｆｉｅｒがｓｓｐＶ１ＢｏｕｎｄＫｅｙであるかどうかをテストする。
【０１５８】
２．ＳＳＰが、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装に従ってＳｅａｌｅｄＢｌｏｂを内部で暗号解読し、平文メッセージＭを入手する。
【０１５９】
３．復号動作の出力が、「復号エラー」である場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＢＡＤ＿ＤＡＴＡ＿ＥＲＲＯＲを返す。
【０１６０】
４．そうでない場合には、回復されたメッセージＭが、ＤＥＲ符号化の下で下記の形でなければならない。
SEQUENCE {
message-type     PKMessageType,
secret          Secret,
target          Digest }
【０１６１】
さらに、Ｓｅｃｒｅｔは、２５６ビット（＝３２オクテット）からならなければならず、ｔａｒｇｅｔは、１６０ビット（＝２０オクテット）からならなければならない。メッセージ型は、ｓｓｐＶ１ＰＫＳｅａｌｅｄＭｅｓｓａｇｅでなければならない。これらの条件のいずれかが満たされない場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＢＡＤ＿ＤＡＴＡ＿ＥＲＲＯＲを返す。そうでない場合には
１．ｔａｒｇｅｔ！＝ＰＣＲの場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＢＡＤ＿ＤＡＴＡ＿ＥＲＲＯＲを返す。  
２．ｔａｒｇｅｔ＝＝ＰＣＲの場合には、ＳｅｃｒｅｔにｓｅｃｒｅｔをセットしてＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０１６２】
束縛鍵動作
さらに、束縛鍵関数または束縛鍵動作の組を用いると、ローカルに暗号鍵を作成でき、証明できるようになり（たとえばＳＳＰによって）、また、信頼されるリモート当事者から暗号鍵を通信できるようになる（たとえば、ＳＳＰに通信する）。
【０１６３】
束縛鍵機能性は、下記の特徴がある。  
１．あるシステム層のサービスガード（たとえばＳＳＰ）が、束縛鍵に直接にアクセスする。各束縛鍵は、どのガードがその束縛鍵にアクセスできるかを判定する関連する条件を有する。条件は、暗黙のうちに表される。すなわち、束縛鍵は、ガードの１つまたはある組だけが束縛鍵を暗号解読する鍵を有するように暗号化される。
【０１６４】
２．束縛鍵へのアクセスを有するサービスガードは、上位層のプリンシパルに束縛鍵の使用を必要とする機能（たとえば、署名、ＭＡＣ、暗号化、暗号解読）を公開する。各束縛鍵は、関連する使用条件を有することができ、その場合に、ガードは、関連する条件を満足する要求だけをサービスする。
【０１６５】
３．束縛鍵は、暗号的に保護されたデータ構造体（本明細書では束縛鍵ｂｌｏｂとも称する）に含まれる。束縛鍵ｂｌｏｂは、自己保護的であり、信頼される環境の外に保存することができる。
【０１６６】
束縛鍵は、下記の長所を有する。  
・各プリンシパルがそれ自体の束縛鍵を有することを許可することができる。さらに、各プリンシパルが、任意の数の束縛鍵を有することを許可することができる。これによって、より細かい粒度のポリシ設定が可能になり、ある種のアプリケーションでのプライバシが改善される。したがって、ガードが、すべてのプリンシパルからの要求をサービスするのに使用される唯一のまたは少数の鍵だけを有するように制限する必要がない。
【０１６７】
・束縛鍵は、許可されるサービスガードの外に開示されない。したがって、プリンシパルを危うくすること（たとえば、プログラミングエラーに起因する）が、すべての束縛鍵を危うくすることにつながらない。一実施形態では、サービスガード（ＳＳＰ）が、ハードウェアで実施される。この場合に、悪意のあるソフトウェアまたは不正なソフトウェアに起因して束縛鍵を危うくすることはできない。
【０１６８】
束縛鍵機能によって、暗号鍵の保護が提供される。束縛鍵を、リモート当事者が生成することができ、あるいは、ＧｅｎＢｏｕｎｄＫｅｙコマンドを介してローカルに作成することができる。
【０１６９】
ローカルに作成される束縛鍵は、公開鍵のタイプ、生成される鍵のタイプ、生成中の機械の状態、および鍵がそれに束縛される（任意選択の）条件（たとえダイジェスト）の証拠をリモート当事者に与えるのに使用することができる「引用」証明書を発することができる。
【０１７０】
束縛鍵には、下記の要素の１つまたは複数が含まれる。  
・鍵の使用法（たとえば、ＢｏｕｎｄＳｉｇｎ、ＢｏｕｎｄＱｕｏｔｅ、ＢｏｕｎｄＰｋＵｎｓｅａｌ、ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ、ＢｏｕｎｄＭＡＣ、ＢｏｕｎｄＥｎｃｒｙｐｔ、またはＢｏｕｎｄＤｅｃｒｙｐｔ）。この要素は、任意選択である。含まれる場合には、この要素によって、束縛鍵が、識別される関数型での使用だけに制限される。
【０１７１】
・どの条件の下でこの束縛鍵を使用できるかを指定する条件要素（上で説明した物）（束縛鍵使用条件とも称する）。たとえば、条件を、プログラムの１つまたは複数のダイジェストの形で表すことができる。この場合に、束縛鍵は、ダイジェストが指定されるプログラムによって、またはそのプログラムの代わりにのみ使用されなければならない。条件の他の要素には、上で説明したように、時間制約、論理式、および実行可能プログラムが含まれる。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、デフォルト条件では、束縛鍵へのアクセスを制限しないことができる（空の条件）。
【０１７２】
・鍵を計算できるようにする、暗号鍵（束縛鍵）または他のデータ。
【０１７３】
・その下で束縛鍵使用条件を変更できる１つまたは複数の条件（上で説明した物）。そのような変更を、束縛鍵移植とも称し、そのような条件を、移植条件と称する。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、ダイジェスト（存在する場合に）を変更できないように、デフォルト条件を「常に偽」とすることができる。
【０１７４】
・その下で、束縛鍵に直接にアクセスできるサービスガードの組を変更できる１つまたは複数の条件。そのような変更を、束縛鍵エクスポートとも称し、そのような条件を、エクスポート条件と称する。この要素は任意選択である。
【０１７５】
束縛鍵の暗号的保護
束縛鍵は、上で説明したシールドストレージおよび立証関数（Ｓｅａｌ、Ｕｎｓｅａｌ、ＰＫＵｎｓｅａｌ）と同一の暗号要件を有する。具体的に言うと、ローカルに生成される束縛鍵は、上で説明したＳｔｏｒｅ関数およびＲｅｔｒｉｅｖｅ関数の暗号実施形態のいずれかによって保護することができる。どの場合でも、束縛鍵の使用法を支配する異なる条件が破壊されていないことを保証するために、束縛鍵自体の信頼性が、保護され、全体的なデータ構造体の保全性が、保護される。前に説明したように、これは、対称暗号または公開鍵暗号化およびＭＡＣまたはディジタル証明のさまざまな組合せによって達成することができる。一実施形態では、束縛鍵データ構造体が、公開鍵によって暗号化される。
【０１７６】
関数
ある実施形態で、束縛鍵を、下記の関数の１つまたは複数で使用することができる。  
・ＢｏｕｎｄＳｉｇｎ
・ＢｏｕｎｄＱｕｏｔｅ
・ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ
・ＢｏｕｎｄＰｋＵｎｓｅａｌ
・ＢｏｕｎｄＭＡＣ
・ＢｏｕｎｄＥｎｃｒｙｐｔ
・ＢｏｕｎｄＤｅｃｒｙｐｔ
・ＧｅｎＢｏｕｎｄＫｅｙ
・ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ
・ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ
【０１７７】
これらの関数のそれぞれで、束縛鍵ｂｌｏｂ（データ構造体内のビットのグループ）および束縛鍵ｂｌｏｂに含まれる鍵によって操作されるデータが、束縛鍵関数へのパラメータとして供給される。鍵使用法要素が束縛鍵ｂｌｏｂに含まれる場合に、ＳＳＰによって、束縛鍵が正しい目的に使用されることが保証される（たとえば、型「ＢｏｕｎｄＱｕｏｔｅＫｅｙ」を使用して作成された鍵は、ＢｏｕｎｄＱｕｏｔｅ動作でのみ使用することができる）。
【０１７８】
いくつかの実施形態で、束縛鍵が、公開／秘密鍵対の秘密鍵である。そのような実施形態では、束縛鍵ｂｌｏｂに、秘密鍵を含めることができ、その代わりに、鍵を計算できるようにする何らかのデータを含めることができる。たとえば、秘密鍵の断片を、束縛鍵ｂｌｏｂに含めることができ、この断片を、対応する公開鍵と共に使用して、公開／秘密鍵対の秘密鍵を再構成することができる。
【０１７９】
ＢｏｕｎｄＳｉｇｎ動作では、束縛鍵を使用して署名されるデータ入力を受け取り、束縛鍵ｂｌｏｂも受け取る。ＳＳＰが、束縛鍵ｂｌｏｂから秘密署名鍵を回復し、回復された署名鍵を使用して、データ入力に対するディジタル署名されたメッセージを生成する。その後、ＳＳＰが、ディジタル署名されたメッセージを出力する。束縛鍵ｂｌｏｂが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。したがって、秘密鍵をＳＳＰが明かさずに、回復された秘密鍵を使用してデータ入力にディジタル署名することができる。
【０１８０】
ＢｏｕｎｄＱｕｏｔｅ動作では、署名されるデータおよび束縛鍵ｂｌｏｂを入力として受け取る。ＳＳＰが、束縛鍵ｂｌｏｂから秘密鍵を回復し、その後、回復された署名鍵を使用して、上で説明したＱｕｏｔｅ動作と同様に、この動作に入力されたデータおよび現在のＰＣＲ値（たとえば、ＢｏｕｎｄＱｕｏｔｅ動作を呼び出したプログラムの、ダイジェストなどの識別子）に対する署名を生成する。その後、ＳＳＰが、ディジタル署名されたメッセージを出力する。束縛鍵ｂｌｏｂが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。一実施形態では、ＢｏｕｎｄＱｕｏｔｅ動作が、ＢｏｕｎｄＳｉｇｎ動作に類似するが、ＢｏｕｎｄＱｕｏｔｅ動作で現在のＰＣＲ値が使用される点が異なる。
【０１８１】
ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ動作では、暗号テキストおよび束縛鍵ｂｌｏｂを入力として受け取る。ＳＳＰが、束縛鍵ｂｌｏｂから秘密鍵を回復し、回復された秘密束縛鍵を使用して、入力暗号テキストを暗号解読する。その後、暗号解読されたデータが、ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ動作によって出力される。束縛鍵ｂｌｏｂが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。
【０１８２】
ＢｏｕｎｄＰｋＵｎｓｅａｌ動作では、暗号テキストおよび束縛鍵ｂｌｏｂを入力として受け取る。ＳＳＰが、束縛鍵ｂｌｏｂから秘密鍵を回復し、その秘密鍵を使用して、上で説明したＰＫＵｎｓｅａｌ動作と同様に、入力暗号テキストを暗号解読する。暗号解読されたデータが、ＢｏｕｎｄＰｋＵｎｓｅａｌ動作によって出力される。束縛鍵ｂｌｏｂが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。
【０１８３】
ＢｏｕｎｄＭＡＣ動作では、それに対して束縛鍵を使用してＭＡＣが計算されるデータ入力を受け取り、束縛鍵ｂｌｏｂも受け取る。束縛鍵ｂｌｏｂが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。そうでない場合には、ＳＳＰが、束縛鍵ｂｌｏｂから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力に対するメッセージ確認コード（ＭＡＣ）を生成する。ＳＳＰが、計算されたＭＡＣを出力する。したがって、ＳＳＰが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力のＭＡＣを計算することができる。
【０１８４】
ＢｏｕｎｄＥｎｃｒｙｐｔ動作では、束縛鍵を使用して暗号化されるデータ入力を受け取り、束縛鍵ｂｌｏｂも受け取る。束縛鍵ｂｌｏｂが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。そうでない場合には、ＳＳＰが、束縛鍵ｂｌｏｂから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号化する。ＳＳＰが、計算された暗号テキストを出力する。したがって、ＳＳＰが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号化することができる。
【０１８５】
ＢｏｕｎｄＤｅｃｒｙｐｔ動作では、束縛鍵を使用して暗号解読されるデータ入力を受け取り、束縛鍵ｂｌｏｂも受け取る。束縛鍵ｂｌｏｂが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、ＳＳＰは、動作を実行しない。そうでない場合には、ＳＳＰが、束縛鍵ｂｌｏｂから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号解読する。ＳＳＰが、計算された平文を出力する。したがって、ＳＳＰが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号解読することができる。
【０１８６】
ＧｅｎＢｏｕｎｄＫｅｙ動作では、ＳＳＰに、新しい束縛鍵を作成させる。新しい束縛鍵は、暗号鍵であり、新たに生成された鍵を含む新しい束縛鍵ｂｌｏｂが生成される。束縛鍵ｂｌｏｂに、必ず鍵全体が含まれるわけではないことを諒解されたい。たとえば、新たに生成される鍵が、公開／秘密鍵対である場合に、束縛鍵ｂｌｏｂに秘密鍵だけを含めれば十分である場合がある。
【０１８７】
新しい束縛鍵ｂｌｏｂは、１つまたは複数のガードに束縛され、このガードは、通常は、動作を実行しているＳＳＰである（たとえば、上で説明したＳｔｏｒｅ関数に似た形で新しい束縛鍵ｂｌｏｂを暗号的に保護することによって、または、他の形で新しい束縛鍵ｂｌｏｂを保護し、その結果、そのＳＳＰだけがそれを検索できるようにすることによって）。ＧｅｎＢｏｕｎｄＫｅｙ動作は、新しい束縛鍵ｂｌｏｂのさまざまな態様を決定するパラメータを有することもでき、これらのパラメータを記述したデータが、ある保全性を保護される形で、新たに生成される秘密鍵に付加される（たとえば、データが、新しい束縛鍵ｂｌｏｂの一部にされる）。このデータの例には、上で説明したように、移植条件、束縛鍵使用条件などが含まれる。その後、新しい束縛鍵ｂｌｏｂが、ＧｅｎＢｏｕｎｄＫｅｙによって出力される。
【０１８８】
一般に、束縛鍵は、対称鍵または公開鍵秘密鍵対を含む、任意の種類の暗号鍵とすることができる。正確な鍵のタイプは、それが使用される束縛鍵動作に依存する。たとえば、ＢｏｕｎｄＭＡＣに使用される束縛鍵は、通常は対称鍵であるが、ＢｏｕｎｄＳｉｇｎに使用される束縛鍵は、通常は公開／秘密署名鍵対である。鍵のタイプは、ＧｅｎＢｏｕｎｄＫｅｙへのパラメータとして指定することができる。
【０１８９】
ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅを用いると、束縛鍵の使用条件を変更できるようになる。ＳＳＰが、１つまたは複数の移植条件が満足されることを検証する。さまざまな条件のどれでも、ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ動作と共に使用することができる（たとえば、Ｓｅａｌ動作およびＵｎＳｅａｌ動作に関して上で説明した条件に類似する、データを移植できる場合および／または相手を識別するすべての条件）。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、ガードが新しい束縛鍵ｂｌｏｂを作り、その束縛鍵ｂｌｏｂ内で、束縛鍵使用条件が、要求された通りに変更されている。
【０１９０】
ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ動作では、ＳＳＰに、束縛鍵に直接にアクセスできるガード（ＳＳＰ）の組を変更するように指示する。ＳＳＰは、１つまたは複数の条件が満足されることを検証する。さまざまな条件のどれでも、ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ動作と共に使用することができる（たとえば、Ｓｅａｌ動作およびＵｎＳｅａｌ動作に関して上で説明した条件に類似する、データをエクスポートできる場合および／または相手を識別するすべての条件）。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、ＳＳＰが、要求された通りに、束縛鍵ｂｌｏｂに対する暗号保護を変更する。一実施形態では、ＳＳＰが、１つまたは複数の新しい鍵を用いて束縛鍵データ構造体を暗号化する。
【０１９１】
束縛鍵の作成者（ローカルであれリモートであれ）が指定できる条件のクラスの例が、束縛鍵を、特定の値を有するプログラムダイジェストを有するプリンシパルの代わりにのみ使用できることである。この場合に、束縛鍵動作によって、束縛鍵ｂｌｏｂの内部検索の後に、要求元プリンシパルのダイジェストが検査され、そのダイジェストが束縛鍵ｂｌｏｂで指定された物でない場合には、追加の計算を実行せずに、束縛鍵動作が失敗する。
【０１９２】
束縛鍵ｂｌｏｂは、通常は、成功するために特定のＳＳＰの一意の鍵を必要とする暗号動作によって、特定のＳＳＰに結び付けられる、すなわち束縛される。そのような動作の例が、ＭＡＣ関数、ディジタル署名関数、暗号化関数、および暗号化関数および保全性検証関数の組合せである。
【０１９３】
束縛鍵動作の例
一実施形態では、移植が、ローカル移植証明書または許可する実体によって発行されたエクスポート証明書によって許可される。ローカル移植証明書は、下記のデータ構造体に対するＲＳＡＳＳＡ−ＰＳＳ−ＳＩＧＮ動作のデフォルトである。
Bound-migration-info ::= SEQUENCE {
source-bound-blob-digest    Digest,
dest-PCR                    DigestPair
}
【０１９４】
ローカルＳＳＰ移植は、ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ動作を使用して要求される。ローカル移植を許可するために、ＳＳＰに、この束縛鍵を参照するＢｏｕｎｄ−ｍｉｇｒａｔｉｏｎ−ｉｎｆｏ構造体、および許可された実体によって供給されるこの構造体に対する正しく形成された証明書が供給される。移植許可が受入可能である場合には、ＳＳＰが、他の鍵属性のすべてを未変更のままにして、新しいＰＣＲについて鍵を再束縛する（たとえば、鍵が元々ＰＣＲ値に束縛されていない場合には、再束縛の場合にも束縛されない）。ｓｏｕｒｃｅ−ｂｏｕｎｄ−ｂｌｏｂ−ｄｉｇｅｓｔは、束縛鍵の暗号化された外部形のダイジェストである。
【０１９５】
リモート移植は、たとえば許可する実体によって署名された下記のＢｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏ構造体を用いて、ＢｏｕｎｄＫｃｙＥｘｐｏｒｔ関数を介して達成される。
Bound export-info ::= SEQUENCE {
source-bound-blob-digest    Digest,
dest-pubkey               RSAPublicKey
dest-PCR                  DigestPair
}
【０１９６】
許可する実体は、鍵がエクスポート可能とマークされる場合に、鍵が再束縛されるデバイスまたはソフトウェアモジュールを完全に制御する。
【０１９７】
束縛鍵動作では、ＰＫＣｉｐｈｅｒｔｅｘｔが使用され、このＰＫＣｉｐｈｅｒｔｅｘｔは、プラットフォーム公開暗号化鍵を用いて暗号化された、下記の型Ｂｏｕｎｄ−ｋｅｙ−ｂｌｏｂのシーケンスである。
Bound-key-blob ::=    SEQUENCE {
message-type     PKMessageType,
key-type         Bound-key-type,
bound-to-PCR     BOOL,
bound-to         DigestPair,
migrateable      Bool,
migrate-auth     Digest,
exportable       Bool,
export-auth      Digest,
pub-key-digest   Digest,
bound-key        PKCompressedPrivateKey }
ここで
Bound-key-type ::=    INTEGER {
BoundSignKey,
BoundQuoteKey
BoundDecryptKey,
BoundPkUnsealKey }
【０１９８】
ｂｏｕｎｄ−ｔｏ−ＰＣＲ要素は、束縛鍵を使用するために、ｂｏｕｎｄ−ｔｏダイジェストフィールドが、現在のＰＣＲ値と一致しなければならないかどうかを示すフラグである。｛ｍｉｇｒａｔｅａｂｌｅ、ｍｉｇｒａｔｅ−ａｕｔｈ｝は、鍵が移植可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す（ｍｉｇｒａｔｅａｂｌｅが偽の場合に、ｍｉｇｒａｔｅ−ａｕｔｈ値は重要でない）。｛ｅｘｐｏｒｔａｂｌｅ、ｅｘｐｏｒｔ−ａｕｔｈ｝は、鍵がエクスポート可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す（ｅｘｐｏｒｔａｂｌｅが偽の場合に、ｅｘｐｏｒｔ−ａｕｔｈ値は重要でない）。ｐｕｂ−ｋｅｙ−ｄｉｇｅｓｔは、ＰＫＣｏｍｐｒｅｓｓｅｄＰｒｉｖａｔｅＫｅｙおよび秘密鍵の回復に必要な公開鍵の間の強い束縛を提供するための、対応する公開鍵のダイジェストである。
【０１９９】
一実施形態では、ＧｅｎＢｏｕｎｄＫｅｙ関数を用いて束縛鍵がローカルに作成される場合に、ＳＳＰが、生成されたばかりの鍵のパブリックプロパティの詳細を示すデータ構造体、および束縛鍵エクスポート中のシステムの構成に対する署名を作成する。
Bound-key-pub-info ::= SEQUENCE {
message-type      PKMessageType,
// sspV1BoundKeyGenMessage
sig-nonce         Digest,
key-type          Bound-key-type,
bound-to-PCR      BOOL,
bound-to          DigestPair,
migrateable       Bool,
migrate-auth      Digest,
exportable        Bool,
export-auth       Digest,
creator-PCR       DigestPair
bound-pub-key     Digest }
【０２００】
このデータ構造体内で、ｋｅｙ−ｔｙｐｅ、ｂｏｕｎｄ−ｔｏ−ＰＣＲ、ｂｏｕｎｄ−ｔｏ、ｍｉｇｒａｔｅａｂｌｅ、ｍｉｇｒａｔｅ−ａｕｔｈ、ｅｘｐｏｒｔａｂｌｅ、およびｅｘｐｏｒｔ−ａｕｔｈが、新たに生成された鍵の束縛鍵特性である。ｃｒｅａｔｏｒ−ＰＣＲは、鍵がエクスポートされた時にアクティブであったＰＣＲであり、ｂｏｕｎｄ−ｐｕｂ−ｋｅｙは、新たに作成された公開鍵のダイジェストである。ｓｉｇ−ｎｏｎｃｅは、束縛鍵生成が要求された時に渡されたダイジェストサイズの値である。
【０２０１】
ＢｏｕｎｄＳｉｇｎ、ＢｏｕｎｄＱｕｏｔｅ、ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ、ＢｏｕｎｄＰｋＵｎｓｅａｌ、ＧｅｎＢｏｕｎｄＫｅｙ、ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ、およびＢｏｕｎｄＫｅｙＥｘｐｏｒｔ動作の例示的定義を下に示す。
【０２０２】
ＢｏｕｎｄＳｉｇｎ
定義
SSP_STATUS BoundSign (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BITSTRING DataToBeSigned
[out] PKSignature sig-blob
)
【０２０３】
パラメータ
BoundSign-Input ::= {
ordinal               INTEGER,
bound-key             BoundKeyBlob,
bound-pub-key         RSAPublicKey,
data-to-be-signed     OCTET STRING }
BoundSign-output ::= {
ordinal              INTEGER,
status               INTEGER,
sig-blob             PKSignature }
【０２０４】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【０２０５】
コメント
ＢｏｕｎｄＳｉｇｎ動作では、型ＢｏｕｎｄＳｉｇｎＫｅｙのＢｏｕｎｄＫｅｙＢｌｏｂを含む型ｓｓｐＶ１ＢｏｕｎｄＫｅｙのＰＫｃｉｐｈｅｒｔｅｘｔおよび対応する公開鍵をとる。この条件のどちらかが満足されない場合、またはシーケンスを復号できない場合に、動作が失敗し、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲが返される。
【０２０６】
ｂｏｕｎｄ−ｔｏ−ＰＣＲがセットされる場合には、ＳＳＰが、現在のＰＣＲ値がＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂシーケンスで指定されていることを検査する。そうでない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２０７】
最後に、ＳＳＰが、暗号解読された秘密鍵を用いて入力メッセージに署名する。
【０２０８】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２０９】
処理
ＢｏｕｎｄＳｉｇｎ動作では、下記の処理を実施する。  
１．ＳＳＰが、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂのＡｌｇｏｒｉｔｈｍＩｄｅｎｔｉｆｉｅｒがｓｓｐＶ１ＢｏｕｎｄＫｅｙであるかどうかをテストする。
【０２１０】
２．ＳＳＰが、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装に従ってＳｅａｌｅｄＢｌｏｂを内部で暗号解読し、平文メッセージＭを入手する。
【０２１１】
３．復号動作の出力が、「復号エラー」である場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２１２】
４．そうでない場合には、回復されたメッセージＭが、型ＢｏｕｎｄＳｉｇｎＫｅｙのＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ形式のＤＥＲ符号化でなければならない。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを発しなければならない。
【０２１３】
５．ｂｏｕｎｄ−ｔｏ−ＰＣＲがＴＲＵＥの場合には、ｂｏｕｎｄ−ｔｏを現在のＰＣＲ値と比較しなければならない。これらの値が同一でない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを出力しなければならない。
【０２１４】
６．ＳＳＰが、供給された関連する公開鍵を使用して束縛された秘密鍵を回復する。これに失敗する場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。成功の場合には、ＳＳＰが、回復された秘密鍵束縛鍵を使用して、ＰＫＣＳ  ＃１  Ｖ２．１で指定されたＲＳＡＳＳＡ−ＰＳＳ−ＳＩＧＮのデフォルト実装に従って、入力メッセージＤａｔａＴｏＢｅＳｉｇｎｅｄに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、ＳｉｇＢｌｏｂに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２１５】
７．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２１６】
ＢｏｕｎｄＱｕｏｔｅ
定義
SSP_STATUS BoundQuote (
[in] PKCiphertext BoundKeyBlob,
[in] DIGEST DataToBeSigned
[out] PKSignature sig-blob
)
【０２１７】
パラメータ
BoundQuote-Input ::= {
ordinal            INTEGER,
bound-key          BoundKeyBlob,
bound-pub-key      RSAPublicKey,
data-to-be-quoted  Digest }
BoundQuote-output ::= {
ordinal           INTEGER,
status            INTEGER,
sig-blob          PKSignature }
【０２１８】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【０２１９】
コメント
ＢｏｕｎｄＱｕｏｔｅ動作では、型ＢｏｕｎｄＱｕｏｔｅＫｅｙのＢｏｕｎｄＫｅｙＢｌｏｂを含む型ｓｓｐＶ１ＢｏｕｎｄＫｅｙのＰＫｃｉｐｈｅｒｔｅｘｔをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲが返される。
【０２２０】
ｂｏｕｎｄ−ｔｏ−ＰＣＲがセットされる場合には、ＳＳＰが、現在のＰＣＲ値がＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂシーケンスで指定されていることを検査する。そうでない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２２１】
最後に、ＳＳＰが、暗号解読された秘密鍵を用いて入力メッセージを引用する。
【０２２２】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２２３】
処理
ＢｏｕｎｄＱｕｏｔｅ動作では、下記の処理を実施する。  
１．ＳＳＰが、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂのＡｌｇｏｒｉｔｈｍＩｄｅｎｔｉｆｉｅｒがｓｓｐＶ１ＢｏｕｎｄＫｅｙであるかどうかをテストする。
【０２２４】
２．ＳＳＰが、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装に従ってＳｅａｌｅｄＢｌｏｂを内部で暗号解読し、平文メッセージＭを入手する。
【０２２５】
３．復号動作の出力が、「復号エラー」である場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２２６】
４．そうでない場合には、回復されたメッセージＭが、型ＢｏｕｎｄＱｕｏｔｅＫｅｙのＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ形式のＤＥＲ符号化でなければならない。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを発しなければならない。
【０２２７】
５．ｂｏｕｎｄ−ｔｏ−ＰＣＲが真の場合には、ｂｏｕｎｄ−ｔｏを現在のＰＣＲ値と比較しなければならない。これらの値が同一でない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを出力しなければならない。
【０２２８】
６．その後、ＳＳＰが、回復された秘密鍵断片および公開鍵を使用して、秘密鍵を再構成する。秘密鍵は、下記のように再構成することができる。一般に、ＲＳＡ鍵は、数Ｎ＝ｐ×ｑ（Ｎは、２つの素数ｐおよびｑの積である）および２つの指数ｅ（暗号化指数）およびｄ（暗号解読指数）からなる。Ｎおよびｅが公開鍵を形成し、ｄが秘密鍵である。一般に、ｄは、Ｎと同じ長さである（たとえば２０４８ビット）。Ｎの因数分解が既知である場合（すなわち、ｐおよびｑが既知の場合）に、秘密鍵ｄを、簡単に判定することができる。ｐおよびｑが、Ｎの半分の長さにすぎないことに留意されたい。したがって、秘密鍵としてｄを保存するのではなく、本発明ではｐを保存する。したがって、公開鍵Ｎ、ｅ、およびｐを与えられれば、値ｑ＝Ｎ／ｐを計算でき、その後、ｐおよびｑから値ｄを決定することができる。
【０２２９】
その後、この秘密鍵を使用して、上で定義されたＱｕｏｔｅ動作の指定に従って、入力メッセージＤａｔａＴｏＢｅＳｉｇｎｅｄおよび現在のＰＣＲ値に対する署名メッセージを生成する。この関数がエラーを返す場合には、ＳｉｇＢｌｏｂに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２３０】
７．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２３１】
ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ
定義
SSP_STATUS BoundPkDecrypt (
[in] PKCiphertext     BoundKeyBlob,
[in] RSAPublicKey     BoundPubKey,
[in] PKCiphertext     DataToBeDecrypted,
[out] Secret          decryptedData
)
【０２３２】
パラメータ
BoundPkDecrypt-Input ::= {
ordinal          INTEGER,
bound-key        BoundKeyBlob,
bound-pub-key    RSAPublicKey,
pk-sealed-blob   PKCiphertext }
BoundPkDecrypt-output ::= {
ordinal         INTEGER,
status          INTEGER,
d-blob          Secret }
【０２３３】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【０２３４】
コメント
ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ動作では、型ＢｏｕｎｄＤｅｃｒｙｐｔＫｅｙのＢｏｕｎｄＫｅｙＢｌｏｂを含む型ｓｓｐＶ１ＢｏｕｎｄＫｅｙのＰＫｃｉｐｈｅｒｔｅｘｔをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲが返される。
【０２３５】
ｂｏｕｎｄ−ｔｏ−ＰＣＲがセットされる場合には、ＳＳＰが、現在のＰＣＲ値がＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂシーケンスで指定されていることを検査する。そうでない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２３６】
最後に、ＳＳＰが、束縛ｂｌｏｂから暗号解読された秘密鍵を用いて入力メッセージを暗号解読する。
【０２３７】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２３８】
処理
ＢｏｕｎｄＰｋＤｅｃｒｙｐｔ動作では、下記の処理を実施する。  
１．ＳＳＰが、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂのＡｌｇｏｒｉｔｈｍＩｄｅｎｔｉｆｉｅｒがｓｓｐＶ１ＢｏｕｎｄＫｅｙであるかどうかをテストする。
【０２３９】
２．ＳＳＰが、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装に従ってＳｅａｌｅｄＢｌｏｂを内部で暗号解読し、平文メッセージＭを入手する。
【０２４０】
３．復号動作の出力が、「復号エラー」である場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２４１】
４．そうでない場合には、回復されたメッセージＭが、型ＢｏｕｎｄＤｅｃｒｙｐｔＫｅｙのＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ形式のＤＥＲ符号化でなければならない。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを発しなければならない。
【０２４２】
５．ｂｏｕｎｄ−ｔｏ−ＰＣＲが真の場合には、ｂｏｕｎｄ−ｔｏを現在のＰＣＲ値と比較しなければならず、これらの値が同一でない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを出力しなければならない。
【０２４３】
６．ＳＳＰが、供給された公開鍵を使用して秘密鍵を回復する。秘密鍵は、上でＢｏｕｎｄＱｕｏｔｅ動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用して、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装を使用してｐｋ−ｓｅａｌｅｄ−ｂｌｏｂを暗号解読し、平文メッセージＭを入手する。
【０２４４】
７．ＳＳＰが、ｄ−ｂｌｏｂにＭをセットする。
【０２４５】
８．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２４６】
ＢｏｕｎｄＰｋＵｎｓｅａｌ
定義
SSP_STATUS BoundPKUnseal (
[in] PKCiphertext     BoundKeyBlob,
[in] RSAPublicKey     BoundPubKey,
[in] PKCiphertext     DataToBeUnsealed
[out] Secret          decryptedData
)
【０２４７】
パラメータ
BoundPKUnseal-Input ::= {
ordinal          INTEGER,
bound-key        BoundKeyBlob,
bound-pub-key    RSAPublicKey,
pk-sealed-blob   PKCiphertext }
BoundPKUnseal-output ::= {
ordinal          INTEGER,
status           INTEGER,
d-blob           Secret }
【０２４８】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【０２４９】
コメント
ＢｏｕｎｄＰｋＵｎｓｅａｌ動作では、型ＢｏｕｎｄＰＫＵｎｓｅａｌＫｅｙのＢｏｕｎｄＫｅｙＢｌｏｂを含む型ｓｓｐＶ１ＢｏｕｎｄＫｅｙのＰＫｃｉｐｈｅｒｔｅｘｔをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲが返される。
【０２５０】
ｂｏｕｎｄ−ｔｏ−ＰＣＲがセットされる場合には、ＳＳＰが、現在のＰＣＲ値がＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂシーケンスで指定されていることを検査する。そうでない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２５１】
最後に、ＳＳＰが、束縛ｂｌｏｂから暗号解読された秘密鍵と共にＰＫ＿Ｕｎｓｅａｌを使用して、入力メッセージを封印解除する。
【０２５２】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２５３】
処理
ＢｏｕｎｄＰｋＵｎｓｅａｌ動作では、下記のステップを実施する。  
１．ＳＳＰが、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂのＡｌｇｏｒｉｔｈｍＩｄｅｎｔｉｆｉｅｒがｓｓｐＶ１ＢｏｕｎｄＫｅｙであるかどうかをテストする。
【０２５４】
２．ＳＳＰが、ＰＫＣＳ  ＃１  Ｖ２．１で指定されるＲＳＡＥＳ−ＯＡＥＰ−ＤＥＣＲＹＰＴのデフォルト実装に従ってＳｅａｌｅｄＢｌｏｂを内部で暗号解読し、平文メッセージＭを入手する。
【０２５５】
３．復号動作の出力が、「復号エラー」である場合には、Ｓｅｃｒｅｔに０をセットしてＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２５６】
４．そうでない場合には、回復されたメッセージＭが、型ＢｏｕｎｄＤｅｃｒｙｐｔＫｅｙのＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ形式のＤＥＲ符号化でなければならない。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを発しなければならない。
【０２５７】
５．ｂｏｕｎｄ−ｔｏ−ＰＣＲが真の場合には、ｂｏｕｎｄ−ｔｏを現在のＰＣＲ値と比較しなければならない。これらの値が同一でない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを出力しなければならない。
【０２５８】
６．ＳＳＰが、束縛鍵ｂｌｏｂを使用して秘密鍵を再作成する。秘密鍵は、上でＢｏｕｎｄＱｕｏｔｅ動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用し、ＰＫ＿Ｕｎｓｅａｌコマンドで説明したステップを使用して、ｐｋ−ｓｅａｌｅｄ−ｂｌｏｂを封印解除する。
【０２５９】
７．封印解除されたｂｌｏｂで名前を指定されるＰＣＲが、現在のＰＣＲと一致しない場合には、ＳＳＰが、ＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２６０】
８.そうでない場合には、ＳＳＰが、ｄ−ｂｌｏｂにＭをセットする。
【０２６１】
９．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２６２】
ＧｅｎＢｏｕｎｄＫｅｙ
定義
SSP_STATUS GenBoundKey (
[in] BoundKeyType  KeyType,
[in] BOOL  BoundToPcr,
[in] DIGEST  BoundTo[2],
[in] BOOL  migrateable,
[in] DIGEST  migrationAuthority,
[in] BOOL  exportable,
[in] DIGEST  exportAuthority,
[in] DIGEST  SigNonce,
[out] BoundKey  bound-key,
[out] PKPublickey  newPubKey,
[out] PKSignature  boundKeyQuoteBlob
)
【０２６３】
パラメータ
GenBoundKey-Input ::= {
ordinal         INTEGER,
key-type        Bound-key-type,
bound-to-pcr    BOOL,
bound-to        DigestPair,
migrateable     BOOL,
migrate-auth    Digest,
exportable      BOOL,
export-auth     Digest,
sig-nonce       Digest
}
GenBoundKey-output ::= {
ordinal        INTEGER,
status         INTEGER,
bound-blob     PKCiphertext,
bound-pub      RSAPublicKey,
sig-blob       PKSignature }
【０２６４】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【０２６５】
コメント
ＧｅｎＢｏｕｎｄＫｅｙ動作では、ＳＳＰに、新たに生成された秘密鍵を含む新しいｂｏｕｎｄ−ｋｅｙ  ｂｌｏｂを生成させる。ｂｏｕｎｄ−ｋｅｙ  ｂｌｏｂは、ＳＳＰ自体の公開鍵を用いて暗号化される。
【０２６６】
ＧｅｎＢｏｕｎｄＫｅｙでは、新たに生成された鍵対の公開鍵、ＳＳＰがその鍵を生成したことを示す引用署名、その特性、および鍵が生成された時のＰＣＲ値も出力される。
【０２６７】
ＧｅｎＢｏｕｎｄＫｅｙを呼び出す側は、作成される束縛鍵のタイプすなわち、それが署名、引用、ＢｏｕｎｄＰｋＵｎｓｅａｌを用いる封印解除、またはＢｏｕｎｄＰｋＤｅｃｒｙｐｔを用いる暗号解読のどれに使用されるかも示す。呼出し側は、束縛鍵をＰＣＲに束縛しなければならないかどうかと、そうである場合に、それが束縛されるＰＣＲ値も指定する。
【０２６８】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey )
【０２６９】
処理
ＧｅｎＢｏｕｎｄＫｅｙ動作では、下記の処理を実施する。  
１．ＳＳＰが、新しい公開秘密ＲＳＡ鍵対を生成する。ＳＳＰは、任意選択として、そうでなければＳＳＰがアイドルである場合に鍵対を生成し、即時検索用に不揮発性メモリ内の鍵の小さいキャッシュに保存することができる。
【０２７０】
２．ＳＳＰが、新たに生成された秘密鍵、および呼出し側によって供給された束縛鍵のタイプおよび他のパラメータを含む束縛鍵構造体を内部で生成する。
【０２７１】
３．ＳＳＰが、プラットフォーム公開暗号化鍵を用いて束縛鍵ｂｌｏｂを暗号化する。
【０２７２】
４．ＳＳＰが、新たに作成された鍵のプロパティ、鍵作成時のＰＣＲ値、および供給されたナンスを含むＢｏｕｎｄ−ｋｅｙ−ｐｕｂ−ｉｎｆｏの署名されたｂｌｏｂを生成する。
【０２７３】
５．ＳＳＰが、暗号化された束縛鍵ｂｌｏｂ、新たに生成された公開鍵、および引用された鍵ｂｌｏｂを出力する。
【０２７４】
６．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２７５】
ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ
定義
SSP_STATUS BoundKeyMigrate (
[in] PKCiphertext  BoundKeyBlob,
[in] RSAPublicKey  PubPartOfBoundKey,
[in] BOUND_MIGRATION_INFO  MigrationInfo,
[in] RSA_SIG  SigOnMigrationInfo
)
【０２７６】
パラメータ
GenBoundKey-Input ::= {
ordinal             INTEGER,
migration-info      Bound-migration-info,
migration-pubkey    RSAPublicKey,
migration-auth      PKSignature
}
GenBoundKey-output ::= {
ordinal           INTEGER,
status            INTEGER,
re-bound-blob     PKCiphertext,
}
【０２７７】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【０２７８】
コメント
ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ動作では、ＳＳＰに、制御された形で鍵を異なるＰＣＲ値に再束縛するように指示する。ローカルまたはリモートの元の鍵作成者が、移植許可実体の名前を指定する。移植可能とマークされた束縛鍵だけを移植することができ、これらの束縛鍵は、適当に署名されたＢｏｕｎｄ−ｍｉｇｒａｔｉｏｎ−ｉｎｆｏ構造体がＳＳＰに供給される場合に限って移植される。適当に署名されたとは、束縛鍵ｂｌｏｂにそのダイジェストが含まれる公開鍵を用いる署名を意味する。他の束縛鍵属性は変更されない。
【０２７９】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２８０】
処理
ＢｏｕｎｄＫｅｙＭｉｇｒａｔｅ動作では、下記の処理を実施する。  
１．ＳＳＰが、ｂｏｕｎｄ−ｋｅｙ構造体を内部で暗号解読し、Ｂｏｕｎｄ−ｋｅｙ−ｂｌｏｂとして解釈する。復号に失敗する場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２８１】
２．ＳＳＰが、Ｂｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Ｂｏｕｎｄ−ｋｅｙ−ｂｌｏｂの「ｍｉｇｒａｔｅａｂｌｅ」フィールドで名前を指定されていることを検証する。
【０２８２】
３．ＳＳＰが、鍵が移植可能であることを検査する。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＯ＿ＥＲＲＯＲを返す。
【０２８３】
４．鍵がＰＣＲに束縛される場合に、ＳＳＰが、現在のＰＣＲが鍵ｂｌｏｂで名前を指定されていることを検査する。
【０２８４】
５．ＳＳＰが、ＰＣＲ値を、Ｂｏｕｎｄ−ｍｉｇｒａｔｉｏｎ−ｉｎｆｏのｄｅｓｔ−ＰＣＲフィールドで名前を指定された物に置換する。
【０２８５】
６．ＳＳＰが、束縛鍵ｂｌｏｂを再暗号化し、再暗号化された構造体をエクスポートする。
【０２８６】
７．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０２８７】
ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ
定義
SSP_STATUS BoundKeyExport (
[in] PKCiphertext  BoundKeyBlob,
[in] RSAPublicKey  PubPartOfBoundKey,
[in] BOUND_EXPORT_INFO  ExportInfo,
[in] RSA_SIG  SigOnExportInfoInfo,
[out] PKCipherText  ReBoundBlob
)
【０２８８】
パラメータ
BoundKeyExport-Input ::= {
ordinal         INTEGER,
bound-key       PKCipherText,
bound-pub-key   RSAPublicKey,
export-info     Bound-export-info,
export-auth    PKSignature,
}
GenBoundKey-output ::= {
ordinal        INTEGER,
status         INTEGER,
re-bound-blob  PKCiphertext,
}
【０２８９】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【０２９０】
コメント
ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ動作では、ＳＳＰに、束縛鍵の秘密部分を、制御された形で、ソースデバイスの束縛鍵との一貫性がある形でリモート実体にエクスポートするように指示する。ローカルまたはリモートの元の鍵作成者が、エクスポート許可実体の名前を指定する。エクスポート可能とマークされた束縛鍵だけをエクスポートすることができ、これらの束縛鍵は、適当に署名されたＢｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏ構造体がＳＳＰに供給される場合に限ってエクスポートされる。適当に署名されたとは、元の束縛鍵ｂｌｏｂにそのダイジェストが含まれる公開鍵を用いる署名を意味する。ＢｏｕｎｄＫｅｙＥｘｐｏｒｔを用いると、適当に許可された呼出し側が、鍵をそれに再束縛しなければならないターゲット実体の公開鍵およびＰＣＲ値を指定できるようになる。外部実体がＳＳＰであるという特別な要件はないが、新たに束縛されるｂｌｏｂは、リモートＳＳＰがエクスポートされた束縛鍵を直接に消費できるようにするために、束縛鍵の慣習に従う。
【０２９１】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【０２９２】
処理
ＢｏｕｎｄＫｅｙＥｘｐｏｒｔ動作では、下記の処理を実施する。
１．ＳＳＰが、ｂｏｕｎｄ−ｋｅｙ構造体を内部で暗号解読し、Ｂｏｕｎｄ−ｋｅｙ−ｂｌｏｂとして解釈する。復号に失敗する場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＴＯ＿ＥＲＲＯＲを返す。
【０２９３】
２．ＳＳＰが、Ｂｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Ｂｏｕｎｄ−ｋｅｙ−ｂｌｏｂの「ｅｘｐｏｒｔａｂｌｅ」フィールドで名前を指定されていることを検証する。
【０２９４】
３．ＳＳＰが、鍵がエクスポート可能であることを検査する。そうでない場合には、ＳＳＰがＳＳＰ＿ＣＲＹＰＯ＿ＥＲＲＯＲを返す。
【０２９５】
４．鍵がＰＣＲに束縛される場合に、ＳＳＰが、現在のＰＣＲが鍵ｂｌｏｂで名前を指定されていることを検査する。
【０２９６】
５．ＳＳＰが、元のＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ構造体のパラメータおよびＢｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏで供給された新しいＰＣＲ値を含む新しいＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂ構造体を内部で生成する。他のすべてのパラメータは、同一のままになる。
【０２９７】
６．ＳＳＰが、Ｂｏｕｎｄ−ｅｘｐｏｒｔ−ｉｎｆｏで供給された公開暗号化鍵を用いて新しいＢｏｕｎｄ−ｋｅｙ−ｂｌｏｂを暗号化する。
【０２９８】
７．新たに束縛された鍵をエクスポートする。
【０２９９】
８．ＳＳＰ＿ＳＵＣＣＥＳＳを返す。
【０３００】
一般的なコンピュータ環境
図１２に、本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境４００を示す。コンピュータ環境４００は、コンピューティング環境の１つの例にすぎず、コンピュータアーキテクチャおよびネットワークアーキテクチャの使用の範囲または機能性に対する制限を暗示することを意図された物ではない。また、コンピュータ環境４００を、例示的なコンピュータ環境４００に示された構成要素の任意の１つまたは組合せに関する依存性または要件を有する物と解釈してはならない。
【０３０１】
コンピュータ環境４００には、コンピュータ４０２の形の汎用コンピューティングデバイスが含まれる。コンピュータ４０２は、たとえば、図１のプリンシパル１０２およびガード１０４または図２の層を実施するのに使用することができる。コンピュータ４０２の構成要素には、１つまたは複数のプロセッサまたは処理ユニット４０４（任意選択として１つまたは複数のセキュリティプロセッサまたはセキュリティコロセッサ（ＳＳＰなど）および／または１つまたは複数の暗号プロセッサまたは暗号コプロセッサを含む）、システムメモリ４０６、プロセッサ４０４を含むさまざまなシステム構成要素をシステムメモリ４０６に結合するシステムバス４０８を含めることができるが、これらに制限はされない。
【０３０２】
システムバス４０８は、メモリバスまたはメモリコントローラ、周辺バス、ａｃｃｅｌｅｒａｔｅｄ  ｇｒａｐｈｉｃｓ  ｐｏｒｔ、およびさまざまなバスアーキテクチャのいずれかを使用するプロセッサバスまたはローカルバスを含む、複数のタイプのバスアーキテクチャのいずれかの１つまたは複数を表す。たとえば、そのようなアーキテクチャに、Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＩＳＡ）バス、マイクロチャネルアーキテクチャ（ＭＣＡ）バス、Ｅｎｈａｎｃｅｄ  ＩＳＡ（ＥＩＳＡ）バス、Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ（ＶＥＳＡ）ローカルバス、および、メザニンバスとも称するＰｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔｓ（ＰＣＩ）バスを含めることができる。
【０３０３】
コンピュータ４０２には、通常は、さまざまなコンピュータ可読媒体が含まれる。そのような媒体は、コンピュータ４０２によってアクセス可能な任意の使用可能な媒体とすることができ、そのような媒体には、揮発性媒体および不揮発性媒体、取外し可能媒体および取外し不能媒体の両方が含まれる。
【０３０４】
システムメモリ４０６には、ランダムアクセスメモリ（ＲＡＭ）４１０などの揮発性メモリ、および／または読取専用メモリ（ＲＯＭ）４１２などの不揮発性メモリの形のコンピュータ可読媒体が含まれる。起動中などにコンピュータ４０２内の要素の間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム（ＢＩＯＳ）４１４が、ＲＯＭ４１２に保存される。ＲＡＭ４１０には、通常は、プロセッサ４０４から即座にアクセス可能および／またはプロセッサ４０４によって現在操作されるデータおよび／またはプログラムモジュールが含まれる。
【０３０５】
コンピュータ４０２には、他の取外し可能／取外し不能、揮発性／不揮発性のコンピュータ記憶媒体も含めることができる。たとえば、図１２に、取外し不能不揮発性磁気媒体（図示せず）から読み取り、それに書き込むハードディスクドライブ４１６、取外し可能不揮発性磁気ディスク４２０（たとえば「フロッピー(登録商標)ディスク」）から読み取り、それに書き込む磁気ディスクドライブ４１８、およびＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、または他の光学媒体などの取外し可能不揮発性光ディスク４２４から読み取り、かつ／またはそれに書き込む光ディスクドライブ４２２が示されている。ハードディスクドライブ４１６、磁気ディスクドライブ４１８、および光ディスクドライブ４２２は、それぞれ、１つまたは複数のデータ媒体インターフェース４２６によってシステムバス４０８に接続される。その代わりに、ハードディスクドライブ４１６、磁気ディスクドライブ４１８、および光ディスクドライブ４２２を、１つまたは複数のインターフェース（図示せず）によってシステムバス４０８に接続することができる。
【０３０６】
ディスクドライブおよびそれに関連するコンピュータ可読媒体によって、コンピュータ４０２の、コンピュータ可読命令、データ構造体、プログラムモジュール、および他のデータの不揮発性ストレージが提供される。この例には、ハードディスク４１６、取外し可能磁気ディスク４２０、および取外し可能光ディスク４２４が示されているが、磁気カセットまたは他の磁気記憶装置、フラッシュメモリカード、ＣＤ−ＲＯＭ、ディジタル多用途ディスク（ＤＶＤ）または他の光ストレージ、ランダムアクセスメモリ（ＲＡＭ）、読取専用メモリ（ＲＯＭ）、電気消去可能プログラマブル読取専用メモリ（ＥＥＰＲＯＭ）、および類似物などの、コンピュータによってアクセス可能なデータを保存できる他のタイプのコンピュータ可読媒体を使用して、例示的なコンピューティングシステムおよび環境を実施することもできることを諒解されたい。
【０３０７】
たとえばオペレーティングシステム４２６、１つまたは複数のアプリケーションプログラム４２８、他のプログラムモジュール４３０、およびプログラムデータ４３２を含む、任意の数のプログラムモジュールを、ハードディスク４１６、磁気ディスク４２０、光ディスク４２４、ＲＯＭ４１２、および／またはＲＡＭ４１０に保存することができる。そのようなオペレーティングシステム４２６、１つまたは複数のアプリケーションプログラム４２８、他のプログラムモジュール４３０、およびプログラムデータ４３２のそれぞれ（またはこれらのある組合せ）によって、分散ファイルシステムをサポートする常駐構成要素のすべてまたは一部を実施することができる。
【０３０８】
ユーザは、キーボード４３４およびポインティングデバイス４３６（たとえば「マウス」）などの入力装置を介してコンピュータ４０２にコマンドおよび情報を入力することができる。他の入力装置４３８（具体的には図示せず）に、マイクロホン、ジョイスティック、ゲームパッド、衛星放送送受信用パラボラアンテナ、シリアルポート、スキャナ、および／または類似物を含めることができる。これらおよび他の入力装置は、システムバス４０８に結合される入出力インターフェース４４０を介して処理ユニット４０４に接続されるが、パラレルポート、ゲームポート、またはｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ（ＵＳＢ）などの他のインターフェースおよびバス構造によって接続することもできる。
【０３０９】
モニタ４４２または他のタイプの表示装置も、ビデオアダプタ４４４などのインターフェースを介してシステムバス４０８に接続することができる。モニタ４４２に加えて、他の出力周辺装置に、スピーカ（図示せず）およびプリンタ４４６など、入出力インターフェース４４０を介してコンピュータ４０２に接続することができる構成要素を含めることができる。
【０３１０】
コンピュータ４０２は、リモートコンピューティングデバイス４４８などの１つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。たとえば、リモートコンピューティングデバイス４４８を、パーソナルコンピュータ、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイスまたは他の一般的なネットワークノード、および類似物とすることができる。リモートコンピューティングデバイス４４８は、コンピュータ４０２に関して本明細書で説明する要素および特徴の多くまたはすべてを含めることができるポータブルコンピュータとして図示されている。
【０３１１】
コンピュータ４０２とリモートコンピュータ４４８の間の論理接続は、ローカルエリアネットワーク（ＬＡＮ）４５０および一般的な広域ネットワーク（ＷＡＮ）４５２として図示されている。そのようなネットワーキング環境は、オフィス、会社全体のコンピュータネットワーク、イントラネット、およびインターネットでありふれた物である。
【０３１２】
ＬＡＮネットワーキング環境で実施される場合に、コンピュータ４０２は、ネットワークインターフェースまたはネットワークアダプタ４５４を介してローカルネットワーク４５０に接続される。ＷＡＮネットワーキング環境で実施される場合に、コンピュータ４０２に、通常は、広域ネットワーク４５２を介する通信を確立するための、モデム４５６または他の手段が含まれる。モデム４５６は、コンピュータ４０２の内蔵または外付けとすることができるが、入出力インターフェース４４０または他の適当な機構を介してシステムバス４０８に接続することができる。図示されたネットワーク接続が、例示的であることと、コンピュータ４０２および４４８の間で通信リンクを確立する他の手段を使用できることを諒解されたい。
【０３１３】
コンピューティング環境４００と共に図示された物などのネットワーク化された環境では、コンピュータ４０２に関して図示されたプログラムモジュールまたはその一部を、リモートメモリストレージデバイスに保存することができる。例として、リモートアプリケーションプログラム４５８が、リモートコンピュータ４４８の記憶装置に常駐する。例示のために、アプリケーションプログラムおよび、オペレーティングシステムなどの他の実行可能プログラムコンポーネントが、この図では別個のブロックとして図示されているが、そのようなプログラムおよびコンポーネントが、さまざまな時にコンピューティング装置４０２の異なるストレージ構成要素に常駐し、コンピュータのデータプロセッサによって実行されることを理解されたい。
【０３１４】
さまざまなモジュールおよび技法を、プログラムモジュールなど、１つまたは複数のコンピュータまたは他の装置によって実行されるコンピュータ実行可能命令の全般的な文脈で本明細書で説明することができる。一般に、プログラムモジュールには、特定の作業を実行するか特定の抽象データ型を実施する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造体などが含まれる。通常、プログラムモジュールの機能性は、さまざまな実施形態で望みに応じて組み合わせるか分散させることができる。
【０３１５】
これらのモジュールおよび技法の実施形態を、何らかの形のコンピュータ可読媒体に保存するか、それを介して伝送することができる。コンピュータ可読媒体は、コンピュータによってアクセス可能なすべての使用可能な媒体とすることができる。制限ではなく例として、コンピュータ可読媒体に、「コンピュータ記憶媒体」および「通信媒体」を含めることができる。
【０３１６】
「コンピュータ記憶媒体」には、コンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータなどの情報の記憶のためのあらゆる方法または技術で実施される、揮発性および不揮発性の、取外し可能および取外し不能の媒体が含まれる。コンピュータ可読媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、ディジタル多用途ディスク(ＤＶＤ)または他の光学記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶装置、または、所望の情報を保存するのに使用でき、コンピュータによってアクセスすることができる他の媒体が含まれるが、これに制限はされない。
【０３１７】
「通信媒体」は、通常は、搬送波または他のトランスポート機構など、変調されたデータ信号内でコンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータを実施する。通信媒体に、情報配送媒体も含まれる。用語「変調されたデータ信号」は、信号内に情報を符号化する形でその特性の１つまたは複数を設定または変更される信号を意味する。制限ではなく例として、通信媒体に、有線ネットワークまたは直接配線接続などの有線媒体と、音響、ＲＦ、赤外線、および他の無線媒体などの無線媒体が含まれる。上記の任意の組合せも、コンピュータ可読媒体の範囲に含まれる。
【０３１８】
上の説明では、構造的特徴および／または方法論的動作に固有の言語を使用したが、請求項で定義される発明が、記載された特定の特徴または動作に制限されないことを理解されたい。そうではなく、特定の特徴および動作は、本発明の実施の例示的形態として開示される。
【符号の説明】
【０３１９】
２００  Ｓｅａｌ動作を実施する例示的なプロセス
２２０  ＵｎＳｅａｌ動作を実施する例示的なプロセス
２５０  Ｓｔｏｒｅ動作を実施する例示的なプロセス
２７０  Ｓｅａｌ動作を実施する例示的なプロセス
３００  Ｑｕｏｔｅ動作を実施する例示的なプロセス
３２０  Ｖｅｒｉｆｙ動作を実施する例示的なプロセス
３４０  ＰＫＵｎｓｅａｌ動作を実施する例示的なプロセス
３６０  ＰＫＳｅａｌ動作を実施する例示的なプロセス
３８０  ＧｅｎＳｅａｌ動作を実施する例示的なプロセス
【図１】
2010170570.tif 000004
【図２】
2010170570.tif 000005
【図３】
2010170570.tif 000006
【図４】
2010170570.tif 000007
【図５】
2010170570.tif 000008
【図６】
2010170570.tif 000009
【図７】
2010170570.tif 000010
【図８】
2010170570.tif 000011
【図９】
2010170570.tif 000012
【図１０】
2010170570.tif 000013
【図１１】
2010170570.tif 000014
【図１２】
2010170570.tif 000015