呼び出しプログラムについての秘密の封印解除方法
【課題】特定の1つまたは複数のターゲットプログラムが、暗号化データを解読できるようにする。
【解決手段】データを対称鍵または公開鍵を使用して暗号化すると共に暗号化を要求するターゲットプログラムの識別子などを秘密を暗号化データの中に封印しておき、ターゲットプログラム(秘密より識別子が示されるプログラム)が暗号化データを解読することができるプログラムであるかを判定して、ターゲットプログラムの暗号解読を許す。
【解決手段】データを対称鍵または公開鍵を使用して暗号化すると共に暗号化を要求するターゲットプログラムの識別子などを秘密を暗号化データの中に封印しておき、ターゲットプログラム(秘密より識別子が示されるプログラム)が暗号化データを解読することができるプログラムであるかを判定して、ターゲットプログラムの暗号解読を許す。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データの保存および検索に関し、具体的には、対称鍵暗号化に基づくデータの保存および検索に関する。
【背景技術】
【0002】
コンピュータ上でデータを保護し、その結果、適当な当事者だけにデータが開示されるようにすることが、ユーザにとって重要な関心事になってきた。ユーザが保護を望むデータのタイプは、仕事関連のまたは個人的な機密文書、銀行口座番号、クレジットカード番号、社会保険番号など、さまざまである。さらに、不正な使用またはアクセスからユーザのコンピュータのデータを保護することが、ある第三者にとって重要である。たとえば、クレジットカード発行会社は、クレジットカード番号が保護され、その結果、コンピュータをハッキングする悪意のあるプログラムまたは当事者にその番号が開示されなくなることを望み、音楽会社は、コピーできないように音楽を保護することを望み、映画スタジオは、コピーできないように映画を保護することを望む。
【先行技術文献】
【非特許文献】
【0003】
【非特許文献1】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.
【発明の概要】
【発明が解決しようとする課題】
【0004】
コンピュータのデータを保護する解決策の1つが、汎用のコンピューティングデバイスを除去し、特殊目的の耐タンパボックスを、保護された内容の配布、保存、および表示に使用することである。しかし、この解決策は、ユーザが自分のコンピュータを拡張できなくなる(たとえば、ユーザが、そのような耐タンパボックスに追加のソフトウェアコンポーネントおよび/またはハードウェア構成要素をインストールできない)ので、望ましくない可能性がある。したがって、汎用コンピューティングデバイスでデータを保護できるようにする方法を提供することが有益である。
【課題を解決するための手段】
【0005】
本明細書では、対称鍵暗号化に基づくデータの保存および検索を開示する。
【0006】
一態様によれば、データが、呼出し側プログラムから受け取られる。データを含む暗号テキストが、対称暗号を使用して、1つまたは複数のターゲットプログラムだけが暗号テキストからデータを得られるようにすることができる形で生成される。
【0007】
もう1つの態様によれば、ビットストリングが、呼出し側プログラムから受け取られる。呼出し側プログラムの識別子を検査して、呼出し側プログラムが、ビットストリングの暗号テキスト内で暗号化されたデータにアクセスすることを許可されるかどうかを判定する。データの保全性も検証され、対称鍵を使用してデータが暗号解読(暗号化解除と称することがある)される。呼出し側プログラムがデータへのアクセスを許可され、データの保全性が成功裡に検証される場合に限って、データが呼出し側プログラムに返される。
【図面の簡単な説明】
【0008】
【図1】例示的なアクセス制御モデルを示す図である。
【図2】4つの異なる階層層を使用する例示的なアクセス制御環境を示す図である。
【図3】Seal動作を実施する例示的なプロセスを示す流れ図である。
【図4】UnSeal動作を実施する例示的なプロセスを示す流れ図である。
【図5】Store動作を実施する例示的なプロセスを示す流れ図である。
【図6】Seal動作を実施する例示的なプロセスを示す流れ図である。
【図7】Quote動作を実施する例示的なプロセスを示す流れ図である。
【図8】Verify動作を実施する例示的なプロセスを示す流れ図である。
【図9】PKUnseal動作を実施する例示的なプロセスを示す流れ図である。
【図10】PKSeal動作を実施する例示的なプロセスを示す流れ図である。
【図11】GenSeal動作を実施する例示的なプロセスを示す流れ図である。
【図12】本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境を示す図である。
【発明を実施するための形態】
【0009】
図1に、例示的なアクセス制御モデル100を示す。プリンシパル102が、保護されたリソースへのアクセスの要求を行うことができる。この要求は、ガード104によって受け取られ、ガード104は、リソース106へのアクセスを制御するコンポーネントである。ガード104は、要求を検査し、リソースのアクセスポリシならびに、要求を発行したプリンシパル102の識別などの他の情報に基づいて、要求を許可するかどうかを決定する。説明を簡単にするために、単一のプリンシパル102、ガード104、およびリソース106が図1に示されている。しかし、アクセス制御モデル100に、複数のプリンシパル102、複数のガード104、および/または複数のリソース106を含めることができることに留意されたい。
【0010】
プリンシパル102は、保護されたデータへのアクセスを要求するコンポーネントまたはモジュールを指す。この要求は、保護されたデータを検索する要求(たとえば、暗号鍵の検索の要求)、または保護されたデータを使用して動作を実行する要求(たとえば、保護されたデータを暗号鍵とすることができ、要求を、暗号鍵を使用する特定のデータの暗号化または暗号解読の要求とすることができる)とすることができる。プリンシパル102は、ハードウェア、ソフトウェア、ファームウェア、またはハードウェア、ソフトウェア、および/またはファームウェアの組合せで、コンポーネントまたはモジュールとして実施することができる。
【0011】
ガード104は、保護されたデータへのアクセスを制御するコンポーネントまたはモジュールを指す。ガード104は、保護されたデータに関連するアクセスポリシ、ならびに他の情報(保護された内容へのアクセスを要求するプリンシパルの識別など)を使用して、プリンシパルが保護されたデータにアクセスすることが許可されるかどうかを判定する。ガード104が、要求元のプリンシパルが保護されたデータへのアクセスを許可されると判定する場合には、ガード104は、適当な形で要求に応答する(たとえば、要求が、保護されたデータに関する要求である場合には、保護されたデータをプリンシパルに返し、要求が、保護されたデータを使用して特定のデータを暗号化する要求である場合には、ガード104は、保護されたデータを使用して特定のデータを暗号化し、暗号テキスト(暗号化されたデータ)をプリンシパルに返す)。ガード104が、要求の性質に基づいてプリンシパルを制限することができることに留意されたい。たとえば、ガード104は、特定のプリンシパルが保護されたデータを使用して特定のデータに署名させることを許可することができるが、保護されたデータをその特定のプリンシパルに返すことを許可しないことができる。
【0012】
ガード104は、開示ガードおよび/またはサービスガードとして特徴を表すこともできる。サービスガードは、プリンシパルからの要求の際に、保護されたデータ(たとえば暗号鍵)を開示せずに、保護されたデータを用いるある動作(たとえば、暗号化、暗号解読、ディジタル署名など)を実行する。その一方で、開示ガードは、許可された要求元に、保護されたデータを明らかにする。特定のガード104を、開示ガードおよびサービスガードの両方とすることができることに留意されたい。
【0013】
リソース106は、アクセスが制限されるすべてのタイプのデータとすることができる。リソース106の例には、暗号鍵、銀行口座番号、クレジットカード番号、社会保険番号などの個人情報、パスワードなどを含めることができる。リソース106は、コンピューティングデバイス内の事実上何にでもすることができる。たとえば、リソース106を、物理メモリ(たとえばRAMまたはROM)、光ディスク、磁気ディスク、光ディスクドライブ、磁気ディスクドライブ、ビデオカード、サウンドカード、スマートカードなどにすることもできる。もう1つの例として、リソース106を、プロセス、ファイル、スレッド、セマフォなどのオペレーティングシステム抽象化とすることもできる。
【0014】
本明細書の説明では、アクセス制御モデル100を、主に、単一のコンピューティングデバイスで実施される物に関して説明する。しかし、このモデルの異なる部分を、異なるコンピューティングデバイスで実施できることを諒解されたい。たとえば、プリンシパル102をあるコンピューティングデバイスに置き、ガード104およびリソース106を別のコンピューティングデバイスに置くことができる。
【0015】
あるコンピューティングデバイスのプリンシパルおよびガードを、任意の数nの階層層lnに分類することができる。図2に、4つの異なる階層層を使用する例示的なアクセス制御環境を示す。一実施形態では、層l1が、ハードウェア層またはセキュリティカーネル層を指し、層l2が、基本入出力システム(BIOS)層を指し、層3が、オペレーティングシステム(OS)層を指し、層4が、アプリケーション層を指す。
【0016】
図2の例の環境では、最下位層(層l1)が、ルートリソースを保護する。中間層(層l2およびl3)のプログラムは、次に下位の層にアクセスを要求するプリンシパルとして働くと同時に、次に上位の層のプリンシパルに向かってガードとして働く。したがって、中間層によって、上位層のプリンシパルに関する機能性を追加することができる。
【0017】
たとえば、プログラム120が、ガード126によって保護されるルートリソース128の検索を望むと仮定する。プログラム120は、モジュール122にルートリソース128へのアクセスを要求するプリンシパルとして働き、モジュール122は、そのリソースのガードとして働く。モジュール122が、リソース128のコピーを有する(たとえば、プログラム120または層l4の他のプログラムによるリソースに関する前の要求に応答して、またはモジュール122が初期化され、コンピューティングデバイスにロードされる場合に、ガード126から得た)場合に、モジュール122は、プログラム120がリソースを検索することを許可されるかどうかを検査する。その後、モジュール122は、プログラム120がリソースを検索することを許可される場合に、プログラム120にリソースを返す。
【0018】
しかし、モジュール122が、リソース128のコピーを有しない場合には、モジュール122は、モジュール124にルートリソースへのアクセスを要求するプリンシパルとして働き、モジュール124は、このリソースのガードとして働く。モジュール124が、リソース128のコピーを有する(たとえば、プログラム122または層l3の他のモジュールによるリソースに関する前の要求に応答して、またはモジュール124が初期化され、コンピューティングデバイスにロードされる場合に、ガード126から得た)場合に、モジュール124は、プログラム122がリソースを検索することを許可されるかどうかを検査する。その後、モジュール124は、プログラム122がリソースを検索することを許可される場合に、プログラム122にリソースを返す。その後、モジュール122は、プログラム120がリソースを検索することを許可される場合に、プログラム120にリソースを返す。
【0019】
しかし、モジュール124が、リソース128のコピーを有しない場合には、モジュール124は、ガード126にルートリソースへのアクセスを要求するプリンシパルとして働く。ガード126は、モジュール124がリソースの検索を許可されるかどうかを検査し、モジュール124がリソースの検索を許可される場合に、モジュール124にリソースを返す。モジュール124は、モジュール122がリソースの検索を許可される場合にモジュール122にリソースを返し、モジュール122は、プログラム120がリソースの検索を許可される場合にプログラム120にリソースを返す。
【0020】
本明細書の説明では、図1のアクセス制御モデル100を使用してソフトウェアの許可される動作を可能にすることに複数の場所で言及する。通常、ソフトウェアの許可された動作で保護されるリソースは、暗号鍵である。しかし、ソフトウェアの許可される動作が、アクセス制御モデル100の使用の1つの例にすぎないことを諒解されたい。
【0021】
アクセス制御モデル100の使用のもう1つの例が、コンピュータに対するユーザの認証である。ほとんどの近代のコンピュータが、アクセス制御システムを有する。ユーザは、コンピュータにログオンし、その結果、コンピュータが、そのユーザが誰であるかを知るようになる。ログオンの後に、ユーザは、通常はシステムリソースへのアクセスを必要とするプログラムを実行する(たとえば、ファイルの読取、画面上のウィンドウへの書込など)。通常、コンピュータのアクセス制御システムが、相談される(たとえば、「ユーザxがリソースzに対する動作yを実行できるか」)。回答が「否」の場合には、プログラムはリソースにアクセスできない。
【0022】
アクセス制御モデル100の使用のもう1つの例が、リモートサービスに対するユーザの認証である。ウェブサイト(たとえばオンラインブローカまたはオンライン銀行)などのリモートサービスは、アクセス制御システムを有するとみなすことができる。リソースは、人々の銀行口座、預金、および株式である。ユーザがウェブサイトにログオンした後に、アクセス制御システムは、そのユーザが、リソース「銀行口座データ」に対する「読取」アクセス(最新の銀行明細書を検索するため)またはリソース「銀行口座12345の1000ドル」への「振替」アクセスなど、ユーザによって要求されたアクセスを実行することを許可されるかどうかを判定する。
【0023】
アクセス制御モデル100の使用のもう1つの例が、特定の建物または区域への物理的アクセスの制限である。たとえば、ユーザが朝に職場に到着した場合に、そのユーザは、自分のバッジを提示し、リソース「フロントドア」に対する「開く」動作を要求する。ある電子システム(ガード)が、バッジに保存された情報に基づいて、そのユーザが建物に入ることを許可されるかどうかを判定し、それに応じてドアの鍵をはずす。
【0024】
コンピューティングデバイスは、プログラムが少なくとも1つの暗号リソースへの保護されたアクセス(開示ガードまたはサービスガードからの)を得られるようにすることが可能である場合に、プログラム(ソフトウェア)の認証された動作を可能にする。ある実施形態で、下で説明する認証および分離を可能にするコンピューティングデバイスが、認証された動作を可能にする。
【0025】
プログラムCを、別のプログラムDから分離されると言うことができるのは、2つの点すなわち、(1)プログラムCによってアクセスできるがプログラムDによってアクセスできないメモリがあり、(2)プログラムDが、プログラムCの実行を開始できない(おそらくはプログラムCによって決定されるエントリポイントを除いて)が満たされる場合である。プログラムは、その推移規則(実行可能コード)およびその初期状態(エントリポイントまたは命令ポインタIPの初期値)によって与えられる。第1の点によって、プログラムDによる敵対する挙動が存在する場合であっても、データをプログラムDによってアクセスできないメモリに保存することができるので、プログラムCのプログラムコードおよび状態情報の保全性が保証される。この点によって、プログラムCが、プログラムDによる観察から機密データ(たとえば暗号鍵)を保護できるようにもなる。第2の点によって、Dが、敵対する形でエントリポイントを選択することによってCの挙動を覆すことができないことが保証される。
【0026】
さらに、プログラムCが、プログラムDの推移規則(プログラムコード)および初期状態の両方を識別できる場合に、プログラムCが、プログラムDを認証できると言うことができる。コンピューティングデバイスは、iがプログラムCの層であるものとして、各層j<iについて、単一のプログラムEjを除いて、すべての他のプログラムDからの任意のプログラムCに関する分離を可能にする。これによって、プログラムCがそれを介してリソースへのアクセスを要求するガードのシーケンス、E1、E2、...、Ei-1を除くすべてのプログラムによる観察および干渉からプログラムが保護される。さらに、任意の層iについて、コンピューティングデバイスは、層iで実行中のプログラムが、層i+1内の少なくともいくつかのプログラムを認証できるようにする。この要件によって、プログラムが、次の層のプリンシパルからの要求に関するガードとして働けるようになる。この2つの観察によって、任意の層のプログラムが、前のプログラムにリソースへのアクセスを要求し、分離を介して保全性およびリソースを保護し、次の層のプリンシパルからの要求を認証をすることによって、リソースに関するガードとして働くことができるという誘導的な議論が与えられる。
【0027】
分離は、物理メモリ保護を使用することによって実施することができる。この手法を、「空間における分離」または「空間分離」と称する。たとえば、多くの近代のマイクロプロセッサにみられるリングメモリ保護および仮想メモリ保護は、空間における分離を実施するのに十分である。特権モードで動作するオペレーティングシステムカーネル(層i)は、アプリケーション(層i+1)のページテーブルをセットアップすることができ、すべてのアプリケーションが、物理メモリのうちで、オペレーティングシステムがそのアプリケーションの仮想アドレス空間にマッピングすることを選択した部分だけにアクセスできるようにする。さらに、カーネルは、アプリケーションがメモリマッピングを変更できないようにするためにアプリケーションの特権を制限し、アプリケーションが明確に定義されたエントリポイント(システム呼出し)でのみカーネルコードの実行を開始できることを保証する。
【0028】
2つの層の間の分離を実施するもう1つの手法が、その実行を時間的に分離することである。この手法を、「時間における分離」または「時間分離」と称する。第1層iのプログラムが、完了まで実行され、あるリソースを使用不能にし、その後、終了する。その後、制御が、次の層i+1に移される。
【0029】
認証は、後続の層(j=i+1)で行われる。プログラムCが、jの構成のプログラム(推移規則)および初期状態を認証する。プログラムは、プログラムCに層jのプログラムを検査させることによって認証することができる。すなわち、通常、プログラムCは、層jのプログラムが含まれるメモリを読み取り、このメモリ範囲に対する暗号ダイジェストを計算する。この点での目標が、コードに関して他のプリンシパルによって行われるステートメントの評価ではなく、コードの識別の確認だけであることに留意されたい。したがって、証明書は、この点では不要である。
【0030】
プログラムCの第2の仕事は、プログラムDの初期状態を識別することである。一般に、任意の実行段階でプログラムの初期状態を判定するという問題は、非常に困難である。したがって、プログラムCは、プログラムDの初期状態を制御する。現実的には、これは、プログラムCが、初期状態σでプログラムDの実行を開始する場合に、プログラムCが、プログラムDの初期状態σだけを確認できることを意味する。
【0031】
要約すると、プログラムDを認証するために、プログラムCは、関連するとみなされるメモリ内容(プログラムおよびおそらくはデータ)を検査し、暗号ダイジェストを計算する。その後、プログラムCが、プログラムDの明確に定義されたエントリポイントに実行を移す。
【0032】
リソースが暗号鍵である場合に、認証される動作によって、各オペレーティングシステムおよびアプリケーションプログラムが、1つまたは複数の秘密への排他的アクセスを有することが可能になる。上で述べた分離によって、敵対するコードによる攻撃から各秘密が保護される。上で述べたプログラムの認証によって、各秘密がそれを所有するプログラムだけに保持されるように、プログラムを識別できるようになる。
【0033】
一般に、プログラム(図1のプリンシパル102)からの要求に対して、ガード104は、プログラムの識別を確立する(すなわち、ガード104がプログラムを認証する)。プログラムが、要求された秘密(リソース106)の所有者でない場合には、ガード104が、その要求を拒否する。そうでない場合には、ガード104は、秘密および、おそらくは、さらに、プログラムによって供給されるさらなる情報のある関数(秘密自体とすることができる)を計算し、その結果を返す。代替案では、要求を明示的に受け入れるか拒否するのではなく、ガード104が、要求をサービスするが、呼出し側の識別を結果に束縛する。この代替手法は、たとえば、ガードによって返される結果に機密情報が含まれない場合(たとえば、秘密を使用してディジタル署名を作る要求)に適当である。用語ゲーティング機能は、本明細書で、この両方の事例を指すのに使用される。
【0034】
さらに、どちらの場合でも、ガード104は、呼出し側(プリンシパル102)を認証する。プリンシパル102の認証を、本明細書では、関数ID()とも称し、この関数は、呼出し側プログラム(ガード104のゲーティング機能を呼び出すプログラム)のダイジェストを返す。ダイジェストは、SHA1(Secure Hash Algorithm 1)、MD5(Message Digest 5)、MD2(Message Digest 2)などのさまざまな暗号ハッシュ関数(1方向ハッシュ関数とも称する)の1つまたは複数の使用、keyed MAC(メッセージ確認コード)の使用など、さまざまな従来の形のどれかで生成することができる。
【0035】
本明細書で説明するゲーティング機能の1つのクラスで、シールドストレージ(sealed strage)が実施される。シールドストレージの目的は、1つまたは複数のプログラムの特定の組(秘密を保存するプログラムによって定義される)だけが秘密を検索できるように、プログラムが秘密を保存できるようにすることである。1つの実施形態で、最初に秘密を保存した(封印(seal)した)プログラムだけが、その秘密を回復(封印解除(unseal))することができる。通常、これらの秘密の寿命は、プログラムの個々の実行の時間を超える。プログラムの単一の実行中に使用される秘密を、保存(封印)することができ、その代わりに、分離および乱数ジェネレータを用いて、プログラムが単一の実行中の秘密を維持できるようにする。シールドストレージによって、プログラムが、時間的にオーバーラップしない可能性がある、異なる実行にまたがって秘密を維持できるようになる。層liが、下記のインターフェースによって、次の層li+1にシールドストレージを公開する(たとえば、「Seal」動作および「UnSeal」動作および/またはPKSeal動作およびPKUnseal動作を使用して)。
【0036】
シールドストレージに関する本明細書の説明で、データの暗号化および暗号解読に使用される暗号鍵に言及する。これらの暗号鍵は、リソースへのアクセスを保護するガード(たとえば図1のガード104)に関連する鍵である。
【0037】
本明細書の説明で、プログラムの識別子(たとえば、動作を呼び出すプログラムの識別子、またはリソースへのアクセスを許可されたターゲットプログラムの識別子)に言及する。本明細書では、これらの識別子を、しばしばダイジェストと称する。しかし、ダイジェストが、プログラムの識別子の1例にすぎないことを諒解されたい。プログラムの測定または他の表現であり、プログラムに対するすべての変更を検出できる他のタイプの識別子を、使用することができる。プログラムに対して何らかの変更が行われる(たとえば、保護されたデータへのアクセスを悪意をもって取得し、そのデータを利用する試みで敵対者が1つまたは複数の命令を変更する)場合に、プログラムの識別子は、その変更を反映しなければならない(たとえば、変更されないプログラムの識別子が、変更されたプログラムの識別子と異なる)。
【0038】
Seal動作は、入力として、封印されるデータ(たとえば秘密)を受け取る。Seal動作は、任意選択として、秘密が明かされる(封印解除される)場合および/または相手を識別する条件を、入力として受け取る。一実施形態では、この条件が、データの検索(封印解除)を許可されるターゲットプログラムのダイジェストである。その代わりに、データの検索(封印解除)を許可されるプログラムを、他の形で識別することができる。たとえば、プログラムを、1つまたは複数の証明書を検証する公開鍵によって識別することができ、この証明書のそれぞれは、1つまたは複数のプログラムに関連する。
【0039】
その代わりに、他の条件を、ターゲットプログラムの識別子に加えてまたはその代わりに使用することができる。たとえば、条件に、その間に秘密を明かす(封印解除する)ことができる特定の時間または曜日など、データを明かす(封印解除する)ことができる時に関する時間制約を含めることができる。もう1つの例として、条件に、秘密を明かす(封印解除する)ために提供しなければならないパスワードまたは他のデータの識別子を含めることができ、たとえば、パスワードの知識を有するプログラムのみによって秘密を封印解除することができる。
【0040】
もう1つの例として、条件を、論理式(たとえば、一階論理で記述されたステートメント、術語論理で記述されたステートメントなど)とすることができる。その論理式が、評価され(たとえばガードによって)、その評価で真の表示が返される場合に限って、秘密が明かされる(封印解除される)。
【0041】
もう1つの例では、条件を、ある言語(たとえば、Java(登録商標)、C*、Java(登録商標)script、VBScriptなど)の実行可能プログラムとすることができる。プログラムが、実行され(たとえばガードによって)、プログラムが、「真」または「満足」の何らかの表示を返す場合に限って、秘密が明かされる(封印解除される)。
【0042】
条件が、ターゲットプログラムのダイジェストと共に供給されるのではなく、ターゲットプログラムのダイジェストである状況では、Seal動作で、Seal動作を呼び出すプログラムのダイジェストを使用することができる(これによって、ターゲットプログラムのダイジェストが暗黙のうちに入力される)。さらに、複数のターゲットプログラムのダイジェストを、Seal動作に入力することができ、これによって、複数のターゲットプログラムがデータを明かす(封印解除する)ことができるようになる。
【0043】
Seal動作では、その入力(データおよびデータの検索(封印解除)を可能にする条件)が、呼出し側の識別子と共に暗号化される。Seal動作では、暗号化された形で(暗号テキストとして)入力データが返される。Seal動作では、封印されたデータの保全性を検証するのに使用することができる値(たとえば、メッセージ確認コード(MAC)値)も返される。この返されるデータを用いると、下で詳細に説明するように、保存されたデータを後続のUnSeal動作で参照できるようになる。
【0044】
Seal動作の擬似コードを、表Iに示す。表Iの擬似コードでは、ID()が、上で説明したID()関数を指し、eが、呼出し側に返される値(たとえばビットのストリングまたはシーケンス)を指し、dataが、封印されるデータを指し、[t1、...、tm]が、データの検索(封印解除)を許可される1つまたは複数(m個)のターゲットプログラムのダイジェスト(または、1つまたは複数の他の条件)を指す。
表I
d=ID()
e= store {data, [t1, ..., tm], d)
return e
【0045】
図3は、Seal動作を実施する例示的なプロセス200を示す流れ図である。プロセス200は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0046】
まず、封印される秘密を呼出し側から受け取る(動作202)。秘密を暗号化し、その結果、秘密を、特定のターゲットプログラムだけによって検索できるようにするか(動作204)、その代わりに、秘密を、1つまたは複数の特定の条件が満足される場合に限って検索できるようにする。暗号化された秘密を含む暗号テキストを、呼出し側に返す(動作206)。呼出し側のあたいダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部として、または暗号テキストとは別に)。
【0047】
UnSeal動作では、呼出し側プログラムが現在検索を望むデータを封印した時にSeal動作によって返されたビットストリング(たとえば暗号鍵)を入力として受け取る。UnSeal動作では、データを明かす条件を入手し、その条件が満足されるかどうかを検査する。たとえば、条件に、データの検索(封印解除)を許可される1つまたは複数のターゲットプログラムのダイジェストが含まれる場合に、UnSeal動作では、これらのダイジェストを入手し、呼出し側プログラムが1つまたは複数のターゲットプログラムの1つであるかどうかを検査する。呼出し側プログラムが、1つまたは複数のターゲットプログラムの1つでない場合には、UnSeal動作が失敗し、要求されたデータは、呼出し側に返されない。しかし、呼出し側プログラムが、1つまたは複数のターゲットプログラムの1つである場合には、UnSeal動作が成功し、要求されたデータが、呼出し側プログラムに返される。データを封印したプログラムのダイジェストも、任意選択として、UnSeal動作から返される。
【0048】
UnSeal動作の擬似コードを表IIに示す。表IIの擬似コードでは、dataが、要求されている(前に封印された)データを指し、[t1、...、tm]が、データの検索(封印解除)を許可される1つまたは複数(m個)のターゲットプログラムのダイジェスト(または、1つまたは複数の他の条件)を指し、eが、UnSeal動作への入力(通常は、Seal動作による前の出力)を指し、dが、データを封印したプログラムのダイジェストを指す。
表II
(data, [t1, ..., tm], d) = retrieve(e)
if ID() is in [t1, ..., tm] then return (data, d)
else fail
【0049】
図4は、UnSeal動作を実施する例示的なプロセス220を示す流れ図である。プロセス220は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0050】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る(動作222)。呼出し側がデータの検索を許可されるかどうかを検査し(動作224)、呼出し側がデータの検索を許可されるかどうかに基づいて処理を進める(動作226)。呼出し側がデータの検索を許可される場合には、データ(暗号解読された)を呼出し側に返す(動作228)。呼出し側がデータの検索を許可されない場合には、処理が失敗し(動作230)、データは、呼出し側に返されない。
【0051】
シールドストレージを、異なる形で実施することができる。一実施形態では、シールドストレージが、物理的に保護された不揮発性メモリを使用して実施される。この実施形態では、コンピューティングデバイスが、保護された不揮発性メモリの異なる部分に異なるガードを関連付け、各ガードが、そのガードに関連付けられた部分だけにアクセスできるようにする。この実施形態では、Seal動作およびUnSeal動作で参照されるStore動作およびRetrieve動作が、コンピューティングデバイスに、ガードに関連する保護された不揮発性メモリ内のデータを、それぞれ保存させるか検索させるために呼び出される。
【0052】
たとえば、ストレージデバイス(ハードディスクドライブなど)によって、ガードを実施することができる。ストレージデバイスに対する読取コマンドおよび書込コマンドを無条件に単純に実行するのではなく、ストレージデバイスが、そのストレージデバイスへのアクセスを試みるプリンシパルを識別し(たとえば、プリンシパルのダイジェストに基づいて)、特定のプリンシパルだけにそのストレージデバイスへのアクセスを許可する。代替案では、異なるプリンシパルを、ストレージデバイスの特定の部分(たとえば、特定のセクタまたはアドレス範囲)だけへのアクセスに制限することができる。
【0053】
もう1つの実施形態では、シールドストレージが、暗号を使用して実施される。暗号を使用するシールドストレージの1つの例示的な実施形態の説明を続ける。
【0054】
暗号を使用してシールドストレージを実施する場合に、リソースは、物理的に保護されるメモリではなく、鍵Kである。Store動作では、その入力が物理的に保存されない。そうではなく、Store動作では、暗号的に保護された出力cが作られ、この出力cが、暗号化され保全性を保護された形でのStore動作の入力になる。暗号化は、入力に対称暗号を適用した結果である。後者のプロパティは、入力(入力を暗号化する前または後のいずれか)にメッセージ確認コード(MAC)を適用することから生じる。
【0055】
Store動作の擬似コードを、表IIIに示す。表IIIの擬似コードでは、bが、Store動作に入力されるビットストリングを指し、cが、Store動作によって出力されるビットストリングを指し、K1が、鍵Kの第1部分を指し、K2が、鍵Kの第2部分を指す。鍵KはSeal動作およびStore動作を実施するガードの対称鍵である。
表III
m = MACK1(b)
c = (m, EncryptK2(b))
return c
【0056】
したがって、表IIIからわかるように、値(m)は、Store動作に入力されるビットストリングにMACを適用することによって生成される。MACは、鍵Kの部分(K1)を鍵とする。また、保存動作に入力されるビットストリングは、鍵Kの第2部分(K2)を使用して暗号化される。入力ビットストリングにMACを適用すること、および入力ビットストリングを暗号化することによって生成された値が、Store動作の呼出し側に返される。
【0057】
鍵Kは、MACと暗号に同一の鍵を使用しないようにするために、2つの独立の鍵K1およびK2に区分される。この区分は、さまざまな形のいずれかで実行することができる。区分では、鍵Kの異なるビットを使用するか、その代わりに、1つまたは複数の同一のビットを使用することができる。たとえば、鍵Kが1024ビットであると仮定すると、下位512ビットを鍵K1として使用し、上位512ビットを鍵K2として使用することができ、偶数番目のビット(ビット0、2、4、6、8、10、...、1022)を鍵K1として使用し、奇数番目(ビット1、3、5、7、9、11、...、1023)を鍵K2として使用することができ、下位650ビットを鍵K1として使用し、上位650ビットを鍵K2として使用することができる(いくつかのビットがK1およびK2の両方に使用されることになる)。その代わりに、同一の鍵KをMACおよび暗号の両方に使用することができる。
【0058】
表IIIに示された擬似コードでは、データに対してMACを計算し、MACを暗号化し、暗号化されたMACを出力することによって、Store動作が実施される。その代わりに、Store動作を異なる形で実施することができる。たとえば、Store動作で、まずデータを暗号化し、次に暗号テキストに対するMACを計算し、暗号テキストおよびMACの両方を出力することができる。もう1つの例として、Store動作で、データに対するMACを計算し、データおよびMACの両方を暗号化し、暗号テキストを出力することができる。
【0059】
Store動作の暗号によって実行される暗号化は、さまざまな対称暗号化アルゴリズムのいずれかを使用して実行することができる。一般に、対称暗号化アルゴリズムでは、暗号化および暗号解読の両方に同一の鍵が使用される。そのようなアルゴリズムの例に、triple−DES(Data Encryption Standard、データ暗号化規格)、AES(Advanced Encryption Standard)などが含まれる。
【0060】
同様に、MACは、さまざまなメッセージ確認コードのいずれか(たとえば、非特許文献1参照)とすることができる。代替案では、MACの代わりに公開鍵ディジタル署名によって保全性を保護することができる。
【0061】
図5は、Store動作を実施する例示的なプロセス250を示す流れ図である。プロセス250は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0062】
まず、保存されるデータを受け取る(動作252)。対称暗号をデータに適用し(動作254)、メッセージ確認コード(MAC)をデータに適用する(動作256)。動作254で生成された暗号化されたデータ、および動作256で生成されたMAC値を呼出し側に返す(動作258)。
【0063】
Retrieve動作では、MAC値および暗号テキストを含むビットストリングを入力として受け取る。暗号テキストを暗号解読して、平文を生成し、その平文のMAC値を生成する。平文について生成されたMAC値が、入力ビットストリングの一部として受け取ったMAC値と同一である場合には、平文を呼出し側に返す。しかし、平文について生成されたMAC値が、入力ビットストリングの一部として受け取ったMAC値と同一でない場合には、Retrieve動作が失敗し、平文は呼出し側に返されない。入力ビットストリングからMACおよび暗号テキストを得るためにRetrieve動作が実施される特定の形が、Store動作が実施される形に依存することを諒解されたい。
【0064】
Retrieve動作の擬似コードを、表IVに示す。表IVの擬似コードでは、cが、Retrieve動作に入力されるビットストリングを指し、bが、Retrieve動作によって出力されるビットストリングを指し、mが、Retrieve動作に入力されたビットストリングのMAC値部分を指し、dが、Retrieve動作に入力されたビットストリングの暗号テキスト部分を指し、K1が、鍵Kの第1部分を指し、K2が、鍵Kの第2部分を指す。K1鍵およびK2鍵は、鍵Kのうちで、Store動作に関して上で説明した物と同一の部分である。
表IV
Let (m, d) = c
b = DecryptK2(d))
if m = MACK1(b) then return b
else fail
【0065】
したがって、表IVからわかるように、値(b)は、Retrieve動作に入力されたビットストリングを暗号解読することによって生成される。その後、MAC値が、値(b)について生成される。Retrieve動作によって生成されたMAC値が、Retrieve動作に入力されたビットストリングの一部として受け取られたMAC値と同一である場合には、値(b)をRetrieve動作の呼出し側に返し、そうでない場合には、Retrieve動作が失敗する。
【0066】
表IVの擬似コードは、データに対するMACを計算し、データを暗号化し、MACおよび暗号テキストを一緒に出力する(これがRetrieve動作の入力ビットストリングとして働く)Store動作の実施形態に基づく。Store動作が、まずデータを暗号化し、暗号テキストに対するMACを計算し、暗号テキストおよびMACの両方を出力するように実施される場合には、Retrieve動作は、暗号テキストのMACを計算し、それを入力ビットストリングの一部として受け取られたMAC値と比較し、MAC値が一致する場合に暗号テキストを暗号解読し、暗号解読されたデータを返すように実施される。Store動作が、データに対するMACを計算し、データおよびMACの両方を暗号化するように実施される場合には、Retrieve動作は、入力ビットストリングを暗号解読し、入力ビットストリングのデータに対するMACを計算し、計算されたMACを暗号解読されたストリングのMAC値と比較し、MAC値が一致する場合にデータを返すように実施される。
【0067】
Store動作に関する上の説明と同様に、さまざまな暗号解読アルゴリズムのどれであっても、Retrieve動作に使用することができる。しかし、暗号解読アルゴリズムは、暗号化されたデータを暗号解読できるようにするために、暗号化アルゴリズムに対応しなければならない。同様に、さまざまなメッセージ確認コードのどれでも、MACとして使用することができるが、メッセージ確認コードは、Store動作によって使用されるメッセージ確認コードと同一でなければならない。
【0068】
図6は、Seal動作を実施する例示的なプロセス270を示す流れ図である。プロセス270は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0069】
まず、暗号テキストおよびMAC値を受け取る(動作272)。暗号テキストを暗号解読して、平文データを生成する(動作274)。メッセージ確認コード(MAC)を平文データに適用して、MAC値を生成し(動作276)、動作276で生成されたMAC値が動作272で受け取ったMAC値と等しいかどうかを検査する(動作278)。その後、処理は、生成されたMAC値が受け取ったMAC値と等しいかどうかに基づいて進行する(動作280)。生成されたMAC値が受け取ったMAC値と等しい場合には、平文データを呼出し側に返す(動作282)。しかし、生成されたMAC値が受け取ったMAC値と等しくない場合には、処理が失敗し(動作284)、平文データは呼出し側に返されない。
【0070】
したがって、シールドストレージに対する暗号手法では、値c(Store動作の出力)のすべての破壊を検出できること、および値b(Store動作への入力)を、鍵K2(値bを暗号化するために暗号によって使用される鍵)にアクセスできなければ検索できないことが、実質的に保証される。
【0071】
ゲーティング機能のもう1つのクラスでは、リモート認証が実施される。リモート認証の目的は、認証機能への強い物理的結合(たとえばサーバまたはスマートカードを使用する)がない場合であってもプログラムを認証できるようにすることである。この状況では、認証は、暗号に基づく。すなわち、両方の実体が、暗号認証プロトコルを介して進む。これには、秘密へのアクセスを有する認証された構成が含まれ、この秘密は、プロトコルに依存するが、通常は秘密鍵または対称鍵である。さらに、コンピューティングデバイスは、この認証秘密の使用を、その使用を要求する構成(たとえば、プロセッサおよび/またはソフトウェア)の識別に結び付けることができる。したがって、認証機能は、コンピューティングデバイスならびにその上で実行されるソフトウェアの識別を確立することができる。
【0072】
2つの動作、Quote動作およびPKUnseal動作が、公開鍵署名および秘密鍵暗号解読のめいめいのゲーティング機能である。これらのゲーティング機能を実施するガードは、署名鍵Ksおよび暗号解読鍵Kdにアクセスできる。署名鍵Ksおよび暗号解読鍵Kdの両方を、公開/秘密鍵対の秘密鍵とも称する。この公開/秘密鍵対は、Quote動作およびPKUnseal動作を実施するガードの鍵対である。
【0073】
Quote動作は、Quote動作への入力、および秘密を明かすことができる場合および/または相手を識別する条件の組合せ(たとえば連結)に対する公開鍵署名を返す。上で説明したSeal動作およびUnSeal動作に似て、秘密を明かすことを、さまざまな条件のどれにでも結び付けることができる。一実施形態では、条件が、呼出し側プログラムの識別子(たとえばダイジェスト)である。
【0074】
署名に固有なのが、動作が、識別される呼出し側プログラムの要求で実行されるという断定である。Quote動作は、Verify動作と共に働き、Verify動作は、通常は、Quote動作が実行されるデバイス以外のデバイスで(たとえば、リモートサーバデバイスで、スマートカードでなど)実行される。Verify動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子(および/または秘密を明かす他の条件)を検索し、評価する。
【0075】
Quote動作の擬似コードを、表Vに示す。表Vの擬似コードでは、ID()が、上で説明したID()関数を指し、aが、Quote動作に入力されるデータを表し、Ksが、署名鍵を指す。
表V
d =ID()
return sn=SignatureKs(d, a)
【0076】
したがって、表Vからわかるように、Quote動作では、呼出し側プログラムのダイジェストを入手し、入力値aを受け取る。Quote動作では、入力値aおよび呼出し側プログラムのダイジェストの、署名鍵Ksを使用するディジタル署名(sn)を生成する。入力値aは、呼出し側プログラムが生成することができ、その代わりに、別のコンポーネントまたはデバイスから(たとえば、Verify動作を実行するデバイスから)受け取られる値とすることができる。ディジタル署名は、公開鍵暗号を使用して生成される。
【0077】
図7は、Quote動作を実施する例示的なプロセス300を示す流れ図である。プロセス300は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0078】
まず、入力データを呼出し側から受け取る(動作302)。呼出し側の識別子(および/または入力データの検索に関する1つまたは複数の他の条件)を入手し(動作304)、入力データおよび呼出し側の識別子(および/または1つまたは複数の他の条件)の組合せに対するディジタル署名を生成する(動作306)。その後、生成されたディジタル署名を呼出し側に返す(動作308)。
【0079】
Verify動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子を検索し、評価する。Verify動作では、通常はVerify動作が実行されるデバイス以外のデバイス(たとえば、リモートサーバデバイス、スマートカードなど)から、Quote動作によって生成されたディジタル署名を受け取る。Verify動作では、受け取ったディジタル署名から、Quote動作を呼び出したプログラム(たとえば、アプリケーションプログラム、オペレーティングシステム、ファームウェアプログラムなど)のダイジェストを抽出し、そのダイジェストを評価して、進行方法を決定する。
【0080】
Verify動作の擬似コードを、表VIに示す。表VIの擬似コードでは、dが、Quote動作を呼び出したプログラムのダイジェストを指し、aが、Quote動作に入力された値を指し、Snが、Verify動作によって入力として受け取られたディジタル署名を指す。
表VI
(d,a)=ExtractKv(Sn)
Evaluate(d)
【0081】
したがって、表VIからわかるように、Verify動作では、ディジタル署名を受け取り、検証鍵Kv(署名鍵Ksを含む公開/秘密鍵対の公開鍵)を使用して、署名からダイジェストdおよび値aを抽出する。その後、Verifyプログラムでは、Quote動作を呼び出したプログラムのダイジェストdを評価することができる。ダイジェストdを評価する形は、変更することができる。たとえば、評価に、ダイジェストdを、「承認された」または「信頼される」アプリケーションプログラムのリストと比較することを含めることができる。
【0082】
図8は、Verify動作を実施する例示的なプロセス320を示す流れ図である。プロセス320は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0083】
まず、ディジタル署名を受け取る(動作322)。入力値を引用した(Quote動作を使用した)呼出し側の識別子(および/または入力値の検索に関する1つまたは複数の他の条件)および入力値自体の両方を、ディジタル署名から抽出する(動作324)。呼出し側の識別子(および/または1つまたは複数の他の条件)を評価して、入力値に関して進行する方法を決定する(動作326)。
【0084】
PKUnseal動作は、公開鍵暗号解読の、呼出し側の識別(たとえば呼出し側プログラムのダイジェスト)またはその代わりに1つまたは複数の他の条件に対してゲーティングされる版である。PKUnseal動作への入力cの公開鍵暗号解読の結果は、対(d、s)として解釈され、ここで、sは、秘密であり、dは、それに対してsを明かすことができる構成(たとえば、呼出し側プログラムのダイジェスト)を識別する。PKUnsealの呼出し側が、dでない場合には、PKUnseal動作が失敗する。PKUnseal動作への入力cは、PKUnseal動作が実行されるデバイス以外のデバイス(たとえば、リモートサーバデバイス、スマートカードなど)で実行することができる第2の動作PKSealによって生成される。PKSeal動作では、対(d、s)の公開鍵暗号化を実行する。PKUnseal動作およびPKSeal動作は、シールドストレージの実施にも使用することができる。
【0085】
PKUnseal動作の擬似コードを、表VIIに示す。表VIIの擬似コードでは、ID()が、上で説明したID()関数を指し、cが、PKUnseal動作への入力を指し、[d1、...、dm]が、それに対してsを明かすことができる1つまたは複数の呼出し側プログラムのダイジェスト(または、その代わりに1つまたは複数の他の条件)を指し、sが、保護されたデータを指し、Kdが、暗号解読鍵(PKUnseal動作を実施するガードに関連する公開/秘密鍵対の秘密鍵)を指す。
表VII
([d1, ..., dm], s) = DecryptKd(c)
if ID() is in [d1, ..., dm] then return s
else fail
【0086】
したがって、表VIIからわかるように、PKUnseal動作では、公開鍵暗号解読および暗号解読鍵Kdを使用して入力値cを暗号解読する。暗号解読された入力値には、保護されたデータsがそれに明かされることを許可される1つまたは複数の呼出し側プログラムのダイジェスト[d1、...、dm](または、その代わりに保護されたデータsを明かすことが許可される場合および/または相手を識別する1つまたは複数の条件)が含まれる。PKUnseal動作では、呼出し側プログラムのダイジェストも生成される。呼出し側プログラムのダイジェストが、ダイジェスト[d1、...、dm]の1つと等しい場合には、保護されたデータsが、呼出し側プログラムに返される。しかし、呼出し側プログラムのダイジェストが、ダイジェスト[d1、...、dm]のどれとも等しくない場合には、保護されたデータsは、呼出し側プログラムに返されない。
【0087】
図9は、PKUnseal動作を実施する例示的なプロセス340を示す流れ図である。プロセス340は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0088】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る(動作342)。呼出し側がそのデータの検索を許可されるかどうかに関する検査を行い(動作344)、呼出し側がそのデータの検索を許可されるかどうかに基づいて処理を進める(動作346)。呼出し側がそのデータの検索を許可される場合には、データ(公開鍵暗号解読を使用して暗号解読された)を呼出し側に返す(動作348)。呼出し側がそのデータの検索を許可されない場合には、処理が失敗し(動作350)、データは、呼出し側に返されない。
【0089】
PKSeal動作は、公開鍵暗号化の、呼出し側の識別(たとえば、呼出し側プログラムあるいは1つまたは複数の他のプログラムのダイジェスト)に基づいてゲーティングされる版である。PKSeal動作では、対(d、s)の公開鍵暗号化を実行し、ここで、sは、秘密であり、dは、それに対してsを明かすことができる1つまたは複数の構成(たとえば、呼出し側プログラムのダイジェスト)を識別する。
【0090】
PKSeal動作の擬似コードを、表VIIIに示す。表VIIIの擬似コードでは、cが、PKSeal動作の出力を指し、[d1、...、dm]が、それに対してsを明かすことができる1つまたは複数の呼出し側プログラムのダイジェストを指し、sが、保護されたデータを指し、Keが、暗号化鍵を指す。
表VIII
c=EncryptKe([d1, ..., dm], s)
return c
【0091】
したがって、表VIIIからわかるように、PKSeal動作では、入力として、保護されたデータs、および保護されたデータsをそれに対して明かすことができる1つまたは複数のプログラムのダイジェスト[d1、...、dm]を受け取る。対[d1、...、dm]、sを、暗号化鍵Keに基づく公開鍵暗号を使用して暗号化する。暗号化鍵Keは、暗号テキストを暗号解読できることが意図されたガードの公開鍵である。公開鍵暗号化から生じる暗号テキストを、呼出し側プログラムに返す。
【0092】
図10は、PKSeal動作を実施する例示的なプロセス360を示す流れ図である。プロセス360は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0093】
まず、封印する秘密を呼出し側から受け取る(動作362)。秘密を公開鍵暗号化を使用して暗号化し、その結果、特定のターゲットプログラムだけが秘密を検索できるようにするか(動作364)、その代わりに、1つまたは複数の他の条件が満たされる場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す(動作366)。呼出し側のダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部としてまたは暗号テキストと別に)。
【0094】
Quote動作およびPKUnseal動作は、公開鍵認証プロトコルと共に使用されることを意図されている。ほとんどの公開鍵認証プロトコルは、公開鍵暗号解読、公開鍵暗号化、署名、および署名検証への呼出しのすべてを、それぞれPKUnseal、PKSeal、Quote、およびVerifyに置換することによって簡単に適合させることができる。
【0095】
いくつかの状況で、乱数を得られることが重要である(たとえば、暗号鍵生成の基礎として)。乱数は、さまざまな異なる形で得ることができる。一実施形態では、乱数の供給源が、コンピューティングデバイスのハードウェアで実施される、暗号的に強い乱数ジェネレータである。
【0096】
上で説明したSeal動作の代替案の1つが、Seal動作を乱数生成動作と組み合わせたGenSeal動作である。GenSeal動作では、入力として、秘密を検索することができなければならないターゲットプログラムのダイジェスト[t1、...、tm](および/または秘密を検索するために満足されなければならない他の条件)を受け取る。GenSeal動作では、乱数を生成し、新たに生成された乱数を封印し、その結果、新たに生成された乱数を、ターゲットダイジェスト[t1、...、tm](および/または満足される他の条件)の1つを有する呼出し側プログラムだけが検索できるようにする。
【0097】
GenSeal動作の擬似コードを、表IXに示す。表IXの擬似コードでは、ID()が、上で説明したID()関数を指し、cが、GenSeal動作の出力を指し、sが、新たに生成される乱数を指し、[t1、...、tm]が、値sを検索することが許可されなければならない1つまたは複数のターゲットプログラム(そのうちの1つを、任意選択として、GenSeal動作を呼び出すプログラムにすることができる)あるいはその代わりに1つまたは複数の他の条件を指し、GenRandom()が、乱数を生成する関数を指す。
表IX
d =ID()
s =GenRandom()
c = store (s, [t1, ..., tm], d)
return c
【0098】
図11は、GenSeal動作を実施する例示的なプロセス380を示す流れ図である。プロセス380は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0099】
まず、秘密を検索できなければならないターゲットプログラムまたはその代わりに秘密を検索するために満足されなければならない1つまたは他の条件を識別する入力を呼出し側から受け取る(動作382)。秘密を生成し(動作384)、秘密を暗号化し、その結果、識別されたターゲットプログラムだけが秘密を検索できるようにする(動作386)か、その代わりに1つまたは他の条件が満足される場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す(動作388)。呼出し側のダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部としてまたは暗号テキストと別に)。
【0100】
開示ガードによって供給されるサービスを、汎用封印サービスに使用することができる。たとえば、図1および2に戻ると、層n−1によって、初期化の際の(たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり)層nの識別に基づいて、層nに単一の鍵が開かされる。層nは、この鍵をキャッシュに入れ、これを使用して追加の秘密を暗号化する。このプラットフォームが同一の構成で次にブートされる時に、開示ガードが、同一のルート鍵を供給し(たとえば、UnSealまたはPKUnsealを介して)、前に暗号化されたすべての秘密を、層nによって検索できる。
【0101】
いくつかの実施形態で、次の層が初期化される時(たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり)に、その、次の層に、下位の層によって1つまたは複数の秘密が開示される。このゲーティングされる開示の後に、下位の層は、もはや使用されなくなる(次のブートまたはリセットまで)。この使用モデルを、開示ガードモデルとも称する。開示ガードモデルを使用することによって、下位層へのアクセスが減る。
【0102】
本明細書で説明するゲーティング機能は、時間分離および空間分離を使用して実施されるサービスガードおよび開示ガードと共に使用することができる。認証動作に関する4つのサービスモデル実施形態すなわち、(1)サービスガード−空間分離、(2)開示ガード−空間分離、(3)開示ガード−時間分離、および(4)サービスガード−時間分離を下で説明する。これらのサービスモデルの説明では、下位ガードが、検討される層のガードに1つまたは複数の鍵を開示したと仮定する。これらの鍵を入手する形は、下の層のガードおよび分離のモデルに依存する。同一のコンピューティングデバイスの異なる層で、これらのサービスモデルの異なる1つを使用することができる。
【0103】
(1)サービスガード−空間分離:ガードが、初期化される場合に要求元プログラムの識別を測定し、保存する。ガードは、プロセッササービス(たとえばCPUあるいは他のセキュリティプロセッサまたはセキュリティコプロセッサの)を使用する保護システム、および認証された動作プリミティブ動作を公開するシステム呼出しインターフェースを実施する。
【0104】
(2)開示ガード−空間分離:ガードが、暗号blobの形で初期化時にサービス要求を得る。blobは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、それ自体およびそれの秘密リソースに関するモード−保護を確立する。
【0105】
(3)開示ガード−時間分離:ガードが、暗号blob(ビットのグループ)の形で初期化時にサービス要求を得る。blobは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、ゲーティング機能を実施するのに使用される鍵を削除(または他の形でアクセス不能に)する。
【0106】
(4)サービスガード−時間分離:サービスガード−時間分離モデルでは、コンピューティングデバイスが、セキュリティリセットにまたがって、プログラム状態を安全に保存する。このモデルは、モデル(1)(サービスガード−空間分離)に類似するが、制御を次の層に渡す前に、サービスガードが、その秘密を削除する(次のリブートまで機能しないようにする)。次の層は、ガードにサービスを要求する必要が生じるまで、普通に実行される。必要になった時点で、次の層は、要求のパラメータを、メモリのうちでリセットに耐える場所に保存し、リセットを実行する。デバイスがリブートする際に、サービスガードが、その秘密を入手し、要求を見、それを実行し(鍵を使用して)、鍵および関連する情報を破壊し、計算の結果および制御を次の層(最初にサービスを要求した層)に渡す。
【0107】
いくつかの実施形態で、コンピューティングデバイスが、空間分離をサポートする場合に、セキュリティカーネルが、プリミティブ(動作)Seal、Unseal、GetRandom(乱数を得るため)、およびPKUnseal(またはQuote)を公開しなければならない。セキュリティカーネルで、開示ガードまたはサービスガードを実施することができる。その一方で、プラットフォームが時間分離をサポートする場合に、セキュリティカーネルが、開示ガードを提供しなければならず、プリミティブ(動作)Unseal、GenSeal、およびPKUnseal(またはQuote)を実施しなければならない。
【0108】
QuoteおよびPKUnsealの機能性を、SealプリミティブおよびUnsealプリミティブまたはUnsealプリミティブおよびGenSealプリミティブに基づいて構築できることにも留意されたい。たとえば、製造業者は、QuoteまたはPKUnsealを実施し、l1で実施されるGenSealおよびUnsealに基づく上位ソフトウェア(たとえばオペレーティングシステム)のホストとして働くl2プログラムを構築することができる。製造業者は、サービス層が必要とする鍵を生成し、Sealし、デバイスまたはCPUと共に出荷する(またはオンラインで使用可能にする)ことができる。
【0109】
プラットフォームが認証された動作をサポートできるようにする、ハードウェア実施形態の系列の例示的な説明を続ける。システムの上位層と同様に、下位層(図2のl1)の特性は、(a)秘密の鍵リソース、(b)これらの鍵にアクセスできる特権コード、および(c)層の制御された初期化である。
【0110】
認証される動作によって、プログラムと秘密の鍵の間の強い束縛が提供される。上位層では、下位層のガードによって、この束縛が保証される。下位層では、プラットフォームの秘密へのアクセスをゲーティングできる、基礎となるソフトウェアガードがない。したがって、l1プログラムへのl1鍵の関連付けをサポートするために、別の機構が使用される。この束縛を達成する方法の1つが、l1ソフトウェアを、製造後に変更できないプラットフォームマイクロコードまたはファームウェアにし、l1ソフトウェアに、l1鍵への制限されないアクセスを与えることである。このプラットフォームマイクロコードまたはファームウェアを、セキュリティカーネルと呼ぶことができ、l1鍵を、プラットフォーム鍵と称する。プラットフォームは、所定のセキュリティカーネルだけに制御を渡すように設計される。このハードウェア挙動を、プラットフォーム鍵を事前定義のセキュリティカーネルに開示する単純なリソースガードと説明することもできる。
【0111】
プラットフォーム鍵およびセキュリティカーネルファームウェアは、プロセッサの一部とするか、その代わりに、コンピューティングデバイスの1つまたは複数の他のコンポーネント(たとえば、暗号動作も実行できるセキュリティプロセッサまたはセキュリティコプロセッサ)で実施することができる。プラットフォーム鍵およびセキュリティカーネルファームウェアは、単一のコンポーネントで実施するか、その代わりにコンピューティングデバイスの複数のコンポーネントで実施することができる。
【0112】
認証された動作を用いると、プログラムが、制御された初期状態で開始される。上位レベルでは、下位レベルで動作するソフトウェアを信頼して、正しいエントリポイントで実行を開始することができる。しかし、l1では、ハードウェアがこの機能を実行する。通常、電源投入時またはリセットの後に、現在のプロセッサは、ある決定論的なシーケンスに従うことによって実行を開始する。たとえば、最も単純な場合に、プロセッサは、アーキテクチャ的に定義されたメモリ位置からコードをフェッチし、実行する。l1について、セキュリティカーネルがスタートアップ時に実行されるコードである(決定論的シーケンスの一部として)ことをハードウェアが保証することによって、プログラムを、制御された初期状態で開始することができる。
【0113】
さらに、他のプラットフォーム状態によって、セキュリティカーネルの実行を破壊できてはならない。リセットおよび電源投入によって、堅牢で確実にデバッグされた状態がプロセッサに明瞭にされなければならない。この例で使用される際に、セキュリティカーネルの開始または呼出しに使用されるプラットフォーム状態変化を、セキュリティリセットと称する。
【0114】
さらに、デバイス製造業者は、SealおよびUnsealのl1実装によって使用されるプラットフォーム鍵の生成またはインストールを配置しなければならない。デバイスが、PKI(公開鍵インフラストラクチャ)の一部として認識されなければならない場合には、製造業者は、プラットフォームの公開鍵の証明も行わなければならない。これは、l1によって直接に使用されるプラットフォーム鍵とするか、その代わりに上位層によって使用される鍵とすることができる。
【0115】
鍵の生成および証明は、CPU製造業者の責任とするか、その代わりにCPUをデバイスに組み立てるOEMなどの第三者の責任とすることができる。その代わりに、この責任を、複数のそのような当事者が共有することができる。
【0116】
セキュリティカーネルが実行されているならば、そのセキュリティカーネルが、上で説明した分離機構を使用して、上位層で実行されるコードからそれ自体を保護することができる。空間における分離には、通常は、特権モードサポートが含まれ、時間における分離には、通常は、上位層から隠される秘密が含まれる。
【0117】
ほとんどの現在のプロセッサでは、空間分離をサポートするための追加のプラットフォームサポートは不要である。すなわち、既存の特権モードまたはレベルで十分である(プラットフォーム鍵へのアクセスを許可するハードウェアリソースを上位層から保護できる限り)。
【0118】
時間分離をサポートするために、ハードウェアの援助を使用して、セキュリティカーネルが、上位層に制御を渡す前にプラットフォーム鍵を隠せるようにする。時間分離モデルでプラットフォーム鍵セキュリティを提供する形の1つが、リセットラッチと称するステートフルガード回路を使用することである。リセットラッチは、リセットまたは電源投入の後に開かれるが、いつでもどのソフトウェアでもこのラッチをプログラム的に閉じることができるというプロパティを有するハードウェア回路である。閉じられたならば、ラッチは、次のリセットまたは電源投入まで閉じられたままになる。時間分離されるセキュリティカーネルを実施するプラットフォームは、リセットラッチの状態に基づいてプラットフォーム鍵アクセスをゲーティングしなければならず、セキュリティカーネルは、上位層に制御を渡す前にこのラッチを閉じなければならない。上で説明したように、セキュリティカーネルは、制御を渡す前に、メモリおよびレジスタのクリアなどの追加処理も講じなければならないが、これらの処理は、上位層で使用される物と同一である。
【0119】
プラットフォームで、空間分離が使用される場合には、セキュリティカーネルで、特権モードを使用して、それ自体およびそのプラットフォーム鍵を、セキュリティカーネルがホストするプログラム(たとえばオペレーティングシステム)から保護する。さらに、セキュリティカーネルは、認証動作の呼出しに関するシステム呼出しインターフェースを確立する。
【0120】
プラットフォームで、空間分離が使用される場合には、そのプラットフォームに、サービスルーチンにパラメータを渡すためにセキュリティリセットの後まで残されるストレージも含まれなければならない。サービスを呼び出すために、オペレーティングシステムは、セキュリティカーネルに既知のメモリ位置にコマンドおよびパラメータブロックを準備し、セキュリティリセットを実行する。OSが、サービス呼出しの後に実行を継続する(単純な再始動ではなく)ことを望む場合には、OSおよびセキュリティカーネルが、これを信頼性があり安全な形で行えることを保証するために余分な処理を講じなければならない。
【0121】
本明細書で説明する認証された動作は、ウィルスからの個人データの保護、ネットワーク攻撃からの機密サーバデータの保護、ネットワーク管理、コピープロテクト、信頼性のある分散コンピューティングなど、さまざまな設定でセキュリティに使用することができる。認証される動作を用いると、特定の信頼関係でなしに同一のコンピュータで実行できる異なるプログラムが、他のソフトウェアの処理に無関係にその暗号リソースを保存できるようになる。
【0122】
下の説明の一部で、SSP(Secure Service Processor、セキュアサービスプロセッサ)に言及する。一実施形態では、SSPが、コンピューティングデバイスに基本的な暗号サービスを提供するプロセッサ(コンピューティングデバイス内で使用するための)である(たとえば、SSPが、本明細書で説明するゲーティング機能(たとえば図2の層l1)をサポートする)。SSPは、暗号鍵を利用することができ、通常は、そのSSPに一意の(または一意であると期待される)1つまたは複数の暗号鍵を有する。SSPは、デバイスのCPUの一部とするか、その代わりに1つまたは複数の他のプロセッサとすることができる。たとえば、SSPを、コンピューティングデバイス内の別のチップまたは集積回路(IC)とすることができる。
【0123】
異なる実施形態では、SSPが、前の実施形態と同一の機能性を呼出し側に公開する、適当に分離されたソフトウェアプログラムである。このSSP実施形態は、暗号鍵へのアクセス(直接にまたは間接的に)を有する。そのようなアクセスの提供に関して、複数の実施形態のオプションが存在する。たとえば、SSPから、下位層のサービスガードまたは開示ガードを呼び出すことができる。あるいは、SSPが、永続メモリ(たとえば、ハードディスク、フラッシュメモリ、ROMなど)のうちで必要な暗号鍵を含む部分への排他的なアクセスを有することができる。
【0124】
要約すると、SSPは、それが上位のプリンシパルに公開する機能性によって定義される。SSPは、暗号鍵へのアクセス(直接のまたは間接的な)を有するガード(上で説明した)である。SSPでは、これらの鍵を使用して、呼出し側に暗号サービスを提供する。以下の節では、SSPが公開する例示的な機能性を説明する。
【0125】
例示的な動作
下記は、シールドストレージ動作の例示的実施形態およびリモート認証動作の説明である。この節では、上で説明したSeal動作、UnSeal動作、Quote動作、およびPKUnseal動作の例の実施形態を説明する。
【0126】
この節では、下記の定義を使用する。
【0127】
【表1】
【0128】
さらに、この節および下の束縛鍵動作の節で、アクセスポリシに言及する。アクセスポリシによって、特定の動作が機能する(すなわち、それが動作する)場合が記述される。コンピューティングデバイスのユーザは、ある機能を選択的にオフに切り替えることがで
【0129】
きる。たとえば、コンピューティングデバイス(たとえばSeal動作を実施するSSP)に、FeatureEnableと称するレジスタが含まれる。このレジスタのビットの1つを、MainEnableと称する。ユーザが、MainEnableに偽をセットする場合に、この節の機能のどれもが、動作しなくなる。各関数に含まれるアクセスポリシの説明によって、どのFeatureEnable設定の下でその関数が動作するかが記述される。
【0130】
Seal
定義
SSP_STATUS Seal (
[in] SECRET S,
[in] DIGEST Target[2],
[in] UINT32 MaxLen,
[out] UINT32* ActualLen,
[out] BYTE* SealedBlob
【0131】
パラメータ
Seal-Input ::= SEQUENCE {
ordinal INTEGER,
secret Secret,
target DigestPair }
Seal-Output ::= SEQUENCE {
ordinal INTEGER,
status INTEGER,
sealed-blob OCTET STRING }
【0132】
戻り値
SSP_SUCCESS
【0133】
コメント
Seal動作は、下記の評価が真の場合に、対応するUnseal動作によってのみ暗号解読できる暗号化されたblob(ビットのグループ)を形成する。
・符号化が正しいか
・MACが正しいか
・現在動作しているSK/SL(セキュリティカーネルまたはセキュアローダー)が、Seal動作中にターゲットとして名前を指定された物であるか
【0134】
Sealでは、内部のランダムさを追加し、その結果、同一の入力に対するSeal動作の出力が、異なる結果を生じるようにする。これによって、Sealをハードウェアデバイス識別子として使用できないことが保証される。Sealには、開封する物に保全性情報を提供するように封印が実行された場合に、Seal動作を呼び出したプログラムの識別子(たとえば、本明細書でPCR値とも称する、SSPのPCRレジスタに保存された、呼出し側プログラムのダイジェスト)も含まれる。
【0135】
アクセスポリシ
Allowed = FeatureEnable.MainEnable & (FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【0136】
処理 Seal動作では、下記の処理が実施される。
1.128ビットの乱数Rを生成する
2.D0が、PCR[0]の現在の値になるようにし、D1=PCR[1]にする
3.ダイジェストM=HMAC[KM](R‖S‖target‖D0‖D1)
4.C=AES[KS](R‖S‖Target‖D0‖D1‖M)
5.SealedBlobにCをセットしてSSP_SUCCESSを返す
【0137】
Unseal
定義
SSP_STATUS Unseal (
[in] BYTE* SealedBlob,
[in] UINT32 SealedBlobLen,
[out] SECRET S,
[out] DIGEST Source
)
【0138】
パラメータ
Unseal-Input ::= SEQUENCE {
ordinal INTEGER,
sealed-blob OCTET STRING }
Unseal-Output ::= SEQUENCE {
ordinal INTEGER,
status INTEGER,
secret Secret,
source Digest }
【0139】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
【0140】
コメント Unseal動作では、Seal動作によって生成されたblobを内部で暗号解読し、下記の条件を検査する。 ・符号化が正しいか ・PCRの現在の値が、Seal動作中にターゲットとして名前を指定された物であるか
【0141】
すべての検査に成功する場合に、secretおよび封印した物のPCRを返し、そうでない場合にはUNSEAL_ERRORを返す。
【0142】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【0143】
処理
Unseal動作では、下記の処理を実施する。
1.M=AES−1[KS](SealedBlob)。
2.Mを(BITS[128] R‖SECRET S1‖DIGEST Target0‖DIGEST Target1‖DIGEST Sealer0‖DIGEST Sealer1‖DIGEST N)として解釈する。
3.ダイジェストD=HMAC[KM](R‖S1‖Target0‖Target1‖Sealer0‖Sealer1)。
4.(Target0!=PCR[0]‖Target1!=PCR[1])の場合に、S、Sourceに0をセットしてSSP_UNSEAL_ERRORを返す。
5.D!=Nの場合に、S、Sourceに0をセットしてSSP_UNSEAL_ERRORを返す。
6.そうでない場合に、SにS1、Sourceに{Sealer0、Sealer1}をセットしてSSP_SUCCESSを返す。
【0144】
Quote
定義
SSP_STATUS Quote (
[in] BITSTRING d-ext,
[out] PKSignature SigBlob
)
【0145】
パラメータ
Quote-Input ::= {
ordinal INTEGER,
d-ext Digest }
Quote-output ::= {
ordinal INTEGER,
status INTEGER,
sig-blob PKSignature }
【0146】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
【0147】
コメント
Quote動作では、SSPに、外部から供給されるD−EXTおよび内部のPCR値の連結に署名するように指示する。
【0148】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0149】
処理 Quote動作では、下記の処理を実施する。 1.SSPは、DER(Distinguished Encoding Rules)符号化の下で、メッセージ型QuoteMessageの識別子D−EXTおよびPCRレジスタの内容の連結からなるメッセージMを形成する。
SEQUENCE {
message-typePK
MessageType,
d-ext Digest,
pcr DigestPair
}
【0150】
2.SSPが、KQ、PRIVを使用して、PKCS #1 V2.1で指定されるRSASSA−PSS−SIGNのデフォルト実装に従って、Mに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0151】
3.SSPが、SSP_SUCCESSおよび計算されたばかりの署名値を、SigBlobのsignatureAlgorithm=rSASSA−PSS−Default−Identifierと共に返す。
【0152】
PKUnseal
定義
SSP_STATUS PK_Unseal (
[in] PKCiphertext SealedBlob,
[out] SECRET Secret
)
【0153】
パラメータ
PkUnseal-Input ::= {
ordinal INTEGER,
pk-sealed-blob PKCiphertext }
PkUnseal-output ::= {
ordinal INTEGER,
status INTEGER,
secret Secret }
【0154】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0155】
コメント PKUnseal動作は、長さ416ビットで特定のフォーマットの暗号化されたblobをとる。blobを暗号解読し、暗号解読および復号が成功の場合には、416ビットメッセージを、秘密値および暗号解読された値を受け取ることを許可されるPCR値の連結として解釈する。
【0156】
現在のPCR値が、暗号化されたblobで指定される物と等しい場合に、秘密を明かし、そうでない場合には、エラーを返す。
【0157】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0158】
処理
PKUnseal動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0159】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0160】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。
【0161】
4.そうでない場合には、回復されたメッセージMが、DER符号化の下で下記の形でなければならない。
SEQUENCE {
message-type PKMessageType,
secret Secret,
target Digest }
【0162】
さらに、Secretは、256ビット(=32オクテット)からならなければならず、targetは、160ビット(=20オクテット)からならなければならない。メッセージ型は、sspV1PKSealedMessageでなければならない。これらの条件のいずれかが満たされない場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。そうでない場合には
1.target!=PCRの場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。
2.target==PCRの場合には、SecretにsecretをセットしてSSP_SUCCESSを返す。
【0163】
束縛鍵動作 さらに、束縛鍵関数または束縛鍵動作の組を用いると、ローカルに暗号鍵を作成でき、証明できるようになり(たとえばSSPによって)、また、信頼されるリモート当事者から暗号鍵を通信できるようになる(たとえば、SSPに通信する)。
【0164】
束縛鍵機能性は、下記の特徴がある。 1.あるシステム層のサービスガード(たとえばSSP)が、束縛鍵に直接にアクセスする。各束縛鍵は、どのガードがその束縛鍵にアクセスできるかを判定する関連する条件を有する。条件は、暗黙のうちに表される。すなわち、束縛鍵は、ガードの1つまたはある組だけが束縛鍵を暗号解読する鍵を有するように暗号化される。
【0165】
2.束縛鍵へのアクセスを有するサービスガードは、上位層のプリンシパルに束縛鍵の使用を必要とする機能(たとえば、署名、MAC、暗号化、暗号解読)を公開する。各束縛鍵は、関連する使用条件を有することができ、その場合に、ガードは、関連する条件を満足する要求だけをサービスする。
【0166】
3.束縛鍵は、暗号的に保護されたデータ構造体(本明細書では束縛鍵blobとも称する)に含まれる。束縛鍵blobは、自己保護的であり、信頼される環境の外に保存することができる。
【0167】
束縛鍵は、下記の長所を有する。
・各プリンシパルがそれ自体の束縛鍵を有することを許可することができる。さらに、各プリンシパルが、任意の数の束縛鍵を有することを許可することができる。これによって、より細かい粒度のポリシ設定が可能になり、ある種のアプリケーションでのプライバシが改善される。したがって、ガードが、すべてのプリンシパルからの要求をサービスするのに使用される唯一のまたは少数の鍵だけを有するように制限する必要がない。
【0168】
・束縛鍵は、許可されるサービスガードの外に開示されない。したがって、プリンシパルを危うくすること(たとえば、プログラミングエラーに起因する)が、すべての束縛鍵を危うくすることにつながらない。一実施形態では、サービスガード(SSP)が、ハードウェアで実施される。この場合に、悪意のあるソフトウェアまたは不正なソフトウェアに起因して束縛鍵を危うくすることはできない。
【0169】
束縛鍵機能によって、暗号鍵の保護が提供される。束縛鍵を、リモート当事者が生成することができ、あるいは、GenBoundKeyコマンドを介してローカルに作成することができる。
【0170】
ローカルに作成される束縛鍵は、公開鍵のタイプ、生成される鍵のタイプ、生成中の機械の状態、および鍵がそれに束縛される(任意選択の)条件(たとえダイジェスト)の証拠をリモート当事者に与えるのに使用することができる「引用」証明書を発することができる。
【0171】
束縛鍵には、下記の要素の1つまたは複数が含まれる。
・鍵の使用法(たとえば、BoundSign、BoundQuote、BoundPkUnseal、BoundPkDecrypt、BoundMAC、BoundEncrypt、またはBoundDecrypt)。この要素は、任意選択である。含まれる場合には、この要素によって、束縛鍵が、識別される関数型での使用だけに制限される。
【0172】
・どの条件の下でこの束縛鍵を使用できるかを指定する条件要素(上で説明した物)(束縛鍵使用条件とも称する)。たとえば、条件を、プログラムの1つまたは複数のダイジェストの形で表すことができる。この場合に、束縛鍵は、ダイジェストが指定されるプログラムによって、またはそのプログラムの代わりにのみ使用されなければならない。条件の他の要素には、上で説明したように、時間制約、論理式、および実行可能プログラムが含まれる。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、デフォルト条件では、束縛鍵へのアクセスを制限しないことができる(空の条件)。
【0173】
・鍵を計算できるようにする、暗号鍵(束縛鍵)または他のデータ。
【0174】
・その下で束縛鍵使用条件を変更できる1つまたは複数の条件(上で説明した物)。そのような変更を、束縛鍵移植とも称し、そのような条件を、移植条件と称する。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、ダイジェスト(存在する場合に)を変更できないように、デフォルト条件を「常に偽」とすることができる。
【0175】
・その下で、束縛鍵に直接にアクセスできるサービスガードの組を変更できる1つまたは複数の条件。そのような変更を、束縛鍵エクスポートとも称し、そのような条件を、エクスポート条件と称する。この要素は任意選択である。
【0176】
束縛鍵の暗号的保護 束縛鍵は、上で説明したシールドストレージおよび立証関数(Seal、Unseal、PKUnseal)と同一の暗号要件を有する。具体的に言うと、ローカルに生成される束縛鍵は、上で説明したStore関数およびRetrieve関数の暗号実施形態のいずれかによって保護することができる。どの場合でも、束縛鍵の使用法を支配する異なる条件が破壊されていないことを保証するために、束縛鍵自体の信頼性が、保護され、全体的なデータ構造体の保全性が、保護される。前に説明したように、これは、対称暗号または公開鍵暗号化およびMACまたはディジタル証明のさまざまな組合せによって達成することができる。一実施形態では、束縛鍵データ構造体が、公開鍵によって暗号化される。
【0177】
関数
ある実施形態で、束縛鍵を、下記の関数の1つまたは複数で使用することができる。
・BoundSign
・BoundQuote
・BoundPkDecrypt
・BoundPkUnseal
・BoundMAC
・BoundEncrypt
・BoundDecrypt
・GenBoundKey
・BoundKeyMigrate
・BoundKeyExport
【0178】
これらの関数のそれぞれで、束縛鍵blob(データ構造体内のビットのグループ)および束縛鍵blobに含まれる鍵によって操作されるデータが、束縛鍵関数へのパラメータとして供給される。鍵使用法要素が束縛鍵blobに含まれる場合に、SSPによって、束縛鍵が正しい目的に使用されることが保証される(たとえば、型「BoundQuoteKey」を使用して作成された鍵は、BoundQuote動作でのみ使用することができる)。
【0179】
いくつかの実施形態で、束縛鍵が、公開/秘密鍵対の秘密鍵である。そのような実施形態では、束縛鍵blobに、秘密鍵を含めることができ、その代わりに、鍵を計算できるようにする何らかのデータを含めることができる。たとえば、秘密鍵の断片を、束縛鍵blobに含めることができ、この断片を、対応する公開鍵と共に使用して、公開/秘密鍵対の秘密鍵を再構成することができる。
【0180】
BoundSign動作では、束縛鍵を使用して署名されるデータ入力を受け取り、束縛鍵blobも受け取る。SSPが、束縛鍵blobから秘密署名鍵を回復し、回復された署名鍵を使用して、データ入力に対するディジタル署名されたメッセージを生成する。その後、SSPが、ディジタル署名されたメッセージを出力する。束縛鍵blobが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。したがって、秘密鍵をSSPが明かさずに、回復された秘密鍵を使用してデータ入力にディジタル署名することができる。
【0181】
BoundQuote動作では、署名されるデータおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、その後、回復された署名鍵を使用して、上で説明したQuote動作と同様に、この動作に入力されたデータおよび現在のPCR値(たとえば、BoundQuote動作を呼び出したプログラムの、ダイジェストなどの識別子)に対する署名を生成する。その後、SSPが、ディジタル署名されたメッセージを出力する。束縛鍵blobが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。一実施形態では、BoundQuote動作が、BoundSign動作に類似するが、BoundQuote動作で現在のPCR値が使用される点が異なる。
【0182】
BoundPkDecrypt動作では、暗号テキストおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、回復された秘密束縛鍵を使用して、入力暗号テキストを暗号解読する。その後、暗号解読されたデータが、BoundPkDecrypt動作によって出力される。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。
【0183】
BoundPkUnseal動作では、暗号テキストおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、その秘密鍵を使用して、上で説明したPKUnseal動作と同様に、入力暗号テキストを暗号解読する。暗号解読されたデータが、BoundPkUnseal動作によって出力される。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。
【0184】
BoundMAC動作では、それに対して束縛鍵を使用してMACが計算されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力に対するメッセージ確認コード(MAC)を生成する。SSPが、計算されたMACを出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力のMACを計算することができる。
【0185】
BoundEncrypt動作では、束縛鍵を使用して暗号化されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号化する。SSPが、計算された暗号テキストを出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号化することができる。
【0186】
BoundDecrypt動作では、束縛鍵を使用して暗号解読されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号解読する。SSPが、計算された平文を出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号解読することができる。
【0187】
GenBoundKey動作では、SSPに、新しい束縛鍵を作成させる。新しい束縛鍵は、暗号鍵であり、新たに生成された鍵を含む新しい束縛鍵blobが生成される。束縛鍵blobに、必ず鍵全体が含まれるわけではないことを諒解されたい。たとえば、新たに生成される鍵が、公開/秘密鍵対である場合に、束縛鍵blobに秘密鍵だけを含めれば十分である場合がある。
【0188】
新しい束縛鍵blobは、1つまたは複数のガードに束縛され、このガードは、通常は、動作を実行しているSSPである(たとえば、上で説明したStore関数に似た形で新しい束縛鍵blobを暗号的に保護することによって、または、他の形で新しい束縛鍵blobを保護し、その結果、そのSSPだけがそれを検索できるようにすることによって)。GenBoundKey動作は、新しい束縛鍵blobのさまざまな態様を決定するパラメータを有することもでき、これらのパラメータを記述したデータが、ある保全性を保護される形で、新たに生成される秘密鍵に付加される(たとえば、データが、新しい束縛鍵blobの一部にされる)。このデータの例には、上で説明したように、移植条件、束縛鍵使用条件などが含まれる。その後、新しい束縛鍵blobが、GenBoundKeyによって出力される。
【0189】
一般に、束縛鍵は、対称鍵または公開鍵秘密鍵対を含む、任意の種類の暗号鍵とすることができる。正確な鍵のタイプは、それが使用される束縛鍵動作に依存する。たとえば、BoundMACに使用される束縛鍵は、通常は対称鍵であるが、BoundSignに使用される束縛鍵は、通常は公開/秘密署名鍵対である。鍵のタイプは、GenBoundKeyへのパラメータとして指定することができる。
【0190】
BoundKeyMigrateを用いると、束縛鍵の使用条件を変更できるようになる。SSPが、1つまたは複数の移植条件が満足されることを検証する。さまざまな条件のどれでも、BoundKeyMigrate動作と共に使用することができる(たとえば、Seal動作およびUnSeal動作に関して上で説明した条件に類似する、データを移植できる場合および/または相手を識別するすべての条件)。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、ガードが新しい束縛鍵blobを作り、その束縛鍵blob内で、束縛鍵使用条件が、要求された通りに変更されている。
【0191】
BoundKeyExport動作では、SSPに、束縛鍵に直接にアクセスできるガード(SSP)の組を変更するように指示する。SSPは、1つまたは複数の条件が満足されることを検証する。さまざまな条件のどれでも、BoundKeyExport動作と共に使用することができる(たとえば、Seal動作およびUnSeal動作に関して上で説明した条件に類似する、データをエクスポートできる場合および/または相手を識別するすべての条件)。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、SSPが、要求された通りに、束縛鍵blobに対する暗号保護を変更する。一実施形態では、SSPが、1つまたは複数の新しい鍵を用いて束縛鍵データ構造体を暗号化する。
【0192】
束縛鍵の作成者(ローカルであれリモートであれ)が指定できる条件のクラスの例が、束縛鍵を、特定の値を有するプログラムダイジェストを有するプリンシパルの代わりにのみ使用できることである。この場合に、束縛鍵動作によって、束縛鍵blobの内部検索の後に、要求元プリンシパルのダイジェストが検査され、そのダイジェストが束縛鍵blobで指定された物でない場合には、追加の計算を実行せずに、束縛鍵動作が失敗する。
【0193】
束縛鍵blobは、通常は、成功するために特定のSSPの一意の鍵を必要とする暗号動作によって、特定のSSPに結び付けられる、すなわち束縛される。そのような動作の例が、MAC関数、ディジタル署名関数、暗号化関数、および暗号化関数および保全性検証関数の組合せである。
【0194】
束縛鍵動作の例
一実施形態では、移植が、ローカル移植証明書または許可する実体によって発行されたエクスポート証明書によって許可される。ローカル移植証明書は、下記のデータ構造体に対するRSASSA−PSS−SIGN動作のデフォルトである。
Bound-migration-info ::= SEQUENCE {
source-bound-blob-digest Digest,
dest-PCR DigestPair
}
【0195】
ローカルSSP移植は、BoundKeyMigrate動作を使用して要求される。ローカル移植を許可するために、SSPに、この束縛鍵を参照するBound−migration−info構造体、および許可された実体によって供給されるこの構造体に対する正しく形成された証明書が供給される。移植許可が受入可能である場合には、SSPが、他の鍵属性のすべてを未変更のままにして、新しいPCRについて鍵を再束縛する(たとえば、鍵が元々PCR値に束縛されていない場合には、再束縛の場合にも束縛されない)。source−bound−blob−digestは、束縛鍵の暗号化された外部形のダイジェストである。
【0196】
リモート移植は、たとえば許可する実体によって署名された下記のBound−export−info構造体を用いて、BoundKcyExport関数を介して達成される。
Bound export-info ::= SEQUENCE {
source-bound-blob-digest Digest,
dest-pubkey RSAPublicKey
dest-PCR DigestPair
}
【0197】
許可する実体は、鍵がエクスポート可能とマークされる場合に、鍵が再束縛されるデバイスまたはソフトウェアモジュールを完全に制御する。
【0198】
束縛鍵動作では、PKCiphertextが使用され、このPKCiphertextは、プラットフォーム公開暗号化鍵を用いて暗号化された、下記の型Bound−key−blobのシーケンスである。
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 }
【0199】
bound−to−PCR要素は、束縛鍵を使用するために、bound−toダイジェストフィールドが、現在のPCR値と一致しなければならないかどうかを示すフラグである。{migrateable、migrate−auth}は、鍵が移植可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す(migrateableが偽の場合に、migrate−auth値は重要でない)。{exportable、export−auth}は、鍵がエクスポート可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す(exportableが偽の場合に、export−auth値は重要でない)。pub−key−digestは、PKCompressedPrivateKeyおよび秘密鍵の回復に必要な公開鍵の間の強い束縛を提供するための、対応する公開鍵のダイジェストである。
【0200】
一実施形態では、GenBoundKey関数を用いて束縛鍵がローカルに作成される場合に、SSPが、生成されたばかりの鍵のパブリックプロパティの詳細を示すデータ構造体、および束縛鍵エクスポート中のシステムの構成に対する署名を作成する。
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 }
【0201】
このデータ構造体内で、key−type、bound−to−PCR、bound−to、migrateable、migrate−auth、exportable、およびexport−authが、新たに生成された鍵の束縛鍵特性である。creator−PCRは、鍵がエクスポートされた時にアクティブであったPCRであり、bound−pub−keyは、新たに作成された公開鍵のダイジェストである。sig−nonceは、束縛鍵生成が要求された時に渡されたダイジェストサイズの値である。
【0202】
BoundSign、BoundQuote、BoundPkDecrypt、BoundPkUnseal、GenBoundKey、BoundKeyMigrate、およびBoundKeyExport動作の例示的定義を下に示す。
【0203】
BoundSign
定義
SSP_STATUS BoundSign (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BITSTRING DataToBeSigned
[out] PKSignature sig-blob
)
【0204】
パラメータ
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 }
【0205】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【0206】
コメント BoundSign動作では、型BoundSignKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextおよび対応する公開鍵をとる。この条件のどちらかが満足されない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0207】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0208】
最後に、SSPが、暗号解読された秘密鍵を用いて入力メッセージに署名する。
【0209】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &(FeatureEnable.UsePrivKey==All |FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0210】
処理
BoundSign動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0211】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0212】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0213】
4.そうでない場合には、回復されたメッセージMが、型BoundSignKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0214】
5.bound−to−PCRがTRUEの場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0215】
6.SSPが、供給された関連する公開鍵を使用して束縛された秘密鍵を回復する。これに失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。成功の場合には、SSPが、回復された秘密鍵束縛鍵を使用して、PKCS #1 V2.1で指定されたRSASSA−PSS−SIGNのデフォルト実装に従って、入力メッセージDataToBeSignedに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0216】
7.SSP_SUCCESSを返す。
【0217】
BoundQuote
定義SSP_STATUS BoundQuote (
[in] PKCiphertext BoundKeyBlob,
[in] DIGEST DataToBeSigned
[out] PKSignature sig-blob)
【0218】
パラメータ
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 }
【0219】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【0220】
コメント BoundQuote動作では、型BoundQuoteKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0221】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0222】
最後に、SSPが、暗号解読された秘密鍵を用いて入力メッセージを引用する。
【0223】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0224】
処理
BoundQuote動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0225】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0226】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0227】
4.そうでない場合には、回復されたメッセージMが、型BoundQuoteKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0228】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0229】
6.その後、SSPが、回復された秘密鍵断片および公開鍵を使用して、秘密鍵を再構成する。秘密鍵は、下記のように再構成することができる。一般に、RSA鍵は、数N=p×q(Nは、2つの素数pおよびqの積である)および2つの指数e(暗号化指数)およびd(暗号解読指数)からなる。Nおよびeが公開鍵を形成し、dが秘密鍵である。一般に、dは、Nと同じ長さである(たとえば2048ビット)。Nの因数分解が既知である場合(すなわち、pおよびqが既知の場合)に、秘密鍵dを、簡単に判定することができる。pおよびqが、Nの半分の長さにすぎないことに留意されたい。したがって、秘密鍵としてdを保存するのではなく、本発明ではpを保存する。したがって、公開鍵N、e、およびpを与えられれば、値q=N/pを計算でき、その後、pおよびqから値dを決定することができる。
【0230】
その後、この秘密鍵を使用して、上で定義されたQuote動作の指定に従って、入力メッセージDataToBeSignedおよび現在のPCR値に対する署名メッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0231】
7.SSP_SUCCESSを返す。
【0232】
BoundPkDecrypt
定義
SSP_STATUS BoundPkDecrypt (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeDecrypted,
[out] Secret decryptedData
)
【0233】
パラメータ
BoundPkDecrypt-Input ::= {
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext }
BoundPkDecrypt-output ::= {
ordinal INTEGER,
status INTEGER,
d-blob Secret }
【0234】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0235】
コメント
BoundPkDecrypt動作では、型BoundDecryptKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0236】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0237】
最後に、SSPが、束縛blobから暗号解読された秘密鍵を用いて入力メッセージを暗号解読する。
【0238】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0239】
処理
BoundPkDecrypt動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0240】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0241】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0242】
4.そうでない場合には、回復されたメッセージMが、型BoundDecryptKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0243】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならず、これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0244】
6.SSPが、供給された公開鍵を使用して秘密鍵を回復する。秘密鍵は、上でBoundQuote動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用して、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装を使用してpk−sealed−blobを暗号解読し、平文メッセージMを入手する。
【0245】
7.SSPが、d−blobにMをセットする。
【0246】
8.SSP_SUCCESSを返す。
【0247】
BoundPkUnseal
定義SSP_STATUS BoundPKUnseal (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeUnsealed
[out] Secret decryptedData
)
【0248】
パラメータ
BoundPKUnseal-Input ::= {
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext }
BoundPKUnseal-output ::= {
ordinal INTEGER,
status INTEGER,
d-blob Secret }
【0249】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0250】
コメント
BoundPkUnseal動作では、型BoundPKUnsealKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0251】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0252】
最後に、SSPが、束縛blobから暗号解読された秘密鍵と共にPK_Unsealを使用して、入力メッセージを封印解除する。
【0253】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0254】
処理
BoundPkUnseal動作では、下記のステップを実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0255】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0256】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0257】
4.そうでない場合には、回復されたメッセージMが、型BoundDecryptKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0258】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0259】
6.SSPが、束縛鍵blobを使用して秘密鍵を再作成する。秘密鍵は、上でBoundQuote動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用し、PK_Unsealコマンドで説明したステップを使用して、pk−sealed−blobを封印解除する。
【0260】
7.封印解除されたblobで名前を指定されるPCRが、現在のPCRと一致しない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0261】
8.そうでない場合には、SSPが、d−blobにMをセットする。
【0262】
9.SSP_SUCCESSを返す。
【0263】
GenBoundKey
定義
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
)
【0264】
パラメータ
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 }
【0265】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0266】
コメント
GenBoundKey動作では、SSPに、新たに生成された秘密鍵を含む新しいbound−key blobを生成させる。bound−key blobは、SSP自体の公開鍵を用いて暗号化される。
【0267】
GenBoundKeyでは、新たに生成された鍵対の公開鍵、SSPがその鍵を生成したことを示す引用署名、その特性、および鍵が生成された時のPCR値も出力される。
【0268】
GenBoundKeyを呼び出す側は、作成される束縛鍵のタイプすなわち、それが署名、引用、BoundPkUnsealを用いる封印解除、またはBoundPkDecryptを用いる暗号解読のどれに使用されるかも示す。呼出し側は、束縛鍵をPCRに束縛しなければならないかどうかと、そうである場合に、それが束縛されるPCR値も指定する。
【0269】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey )
【0270】
処理
GenBoundKey動作では、下記の処理を実施する。
1.SSPが、新しい公開秘密RSA鍵対を生成する。SSPは、任意選択として、そうでなければSSPがアイドルである場合に鍵対を生成し、即時検索用に不揮発性メモリ内の鍵の小さいキャッシュに保存することができる。
【0271】
2.SSPが、新たに生成された秘密鍵、および呼出し側によって供給された束縛鍵のタイプおよび他のパラメータを含む束縛鍵構造体を内部で生成する。
【0272】
3.SSPが、プラットフォーム公開暗号化鍵を用いて束縛鍵blobを暗号化する。
【0273】
4.SSPが、新たに作成された鍵のプロパティ、鍵作成時のPCR値、および供給されたナンスを含むBound−key−pub−infoの署名されたblobを生成する。
【0274】
5.SSPが、暗号化された束縛鍵blob、新たに生成された公開鍵、および引用された鍵blobを出力する。
【0275】
6.SSP_SUCCESSを返す。
【0276】
BoundKeyMigrate
定義
SSP_STATUS BoundKeyMigrate (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_MIGRATION_INFO MigrationInfo,
[in] RSA_SIG SigOnMigrationInfo
)
【0277】
パラメータ
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,
}
【0278】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0279】
コメント
BoundKeyMigrate動作では、SSPに、制御された形で鍵を異なるPCR値に再束縛するように指示する。ローカルまたはリモートの元の鍵作成者が、移植許可実体の名前を指定する。移植可能とマークされた束縛鍵だけを移植することができ、これらの束縛鍵は、適当に署名されたBound−migration−info構造体がSSPに供給される場合に限って移植される。適当に署名されたとは、束縛鍵blobにそのダイジェストが含まれる公開鍵を用いる署名を意味する。他の束縛鍵属性は変更されない。
【0280】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0281】
処理
BoundKeyMigrate動作では、下記の処理を実施する。
1.SSPが、bound−key構造体を内部で暗号解読し、Bound−key−blobとして解釈する。復号に失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。
【0282】
2.SSPが、Bound−export−infoが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Bound−key−blobの「migrateable」フィールドで名前を指定されていることを検証する。
【0283】
3.SSPが、鍵が移植可能であることを検査する。そうでない場合には、SSPがSSP_CRYPO_ERRORを返す。
【0284】
4.鍵がPCRに束縛される場合に、SSPが、現在のPCRが鍵blobで名前を指定されていることを検査する。
【0285】
5.SSPが、PCR値を、Bound−migration−infoのdest−PCRフィールドで名前を指定された物に置換する。
【0286】
6.SSPが、束縛鍵blobを再暗号化し、再暗号化された構造体をエクスポートする。
【0287】
7.SSP_SUCCESSを返す。
【0288】
BoundKeyExport
定義
SSP_STATUS BoundKeyExport (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_EXPORT_INFO ExportInfo,
[in] RSA_SIG SigOnExportInfoInfo,
[out] PKCipherText ReBoundBlob
)
【0289】
パラメータ
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,
}
【0290】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0291】
コメント
BoundKeyExport動作では、SSPに、束縛鍵の秘密部分を、制御された形で、ソースデバイスの束縛鍵との一貫性がある形でリモート実体にエクスポートするように指示する。ローカルまたはリモートの元の鍵作成者が、エクスポート許可実体の名前を指定する。エクスポート可能とマークされた束縛鍵だけをエクスポートすることができ、これらの束縛鍵は、適当に署名されたBound−export−info構造体がSSPに供給される場合に限ってエクスポートされる。適当に署名されたとは、元の束縛鍵blobにそのダイジェストが含まれる公開鍵を用いる署名を意味する。BoundKeyExportを用いると、適当に許可された呼出し側が、鍵をそれに再束縛しなければならないターゲット実体の公開鍵およびPCR値を指定できるようになる。外部実体がSSPであるという特別な要件はないが、新たに束縛されるblobは、リモートSSPがエクスポートされた束縛鍵を直接に消費できるようにするために、束縛鍵の慣習に従う。
【0292】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0293】
処理
BoundKeyExport動作では、下記の処理を実施する。
1.SSPが、bound−key構造体を内部で暗号解読し、Bound−key−blobとして解釈する。復号に失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。
【0294】
2.SSPが、Bound−export−infoが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Bound−key−blobの「exportable」フィールドで名前を指定されていることを検証する。
【0295】
3.SSPが、鍵がエクスポート可能であることを検査する。そうでない場合には、SSPがSSP_CRYPO_ERRORを返す。
【0296】
4.鍵がPCRに束縛される場合に、SSPが、現在のPCRが鍵blobで名前を指定されていることを検査する。
【0297】
5.SSPが、元のBound−key−blob構造体のパラメータおよびBound−export−infoで供給された新しいPCR値を含む新しいBound−key−blob構造体を内部で生成する。他のすべてのパラメータは、同一のままになる。
【0298】
6.SSPが、Bound−export−infoで供給された公開暗号化鍵を用いて新しいBound−key−blobを暗号化する。
【0299】
7.新たに束縛された鍵をエクスポートする。
【0300】
8.SSP_SUCCESSを返す。
【0301】
一般的なコンピュータ環境
図12に、本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境400を示す。コンピュータ環境400は、コンピューティング環境の1つの例にすぎず、コンピュータアーキテクチャおよびネットワークアーキテクチャの使用の範囲または機能性に対する制限を暗示することを意図された物ではない。また、コンピュータ環境400を、例示的なコンピュータ環境400に示された構成要素の任意の1つまたは組合せに関する依存性または要件を有する物と解釈してはならない。
【0302】
コンピュータ環境400には、コンピュータ402の形の汎用コンピューティングデバイスが含まれる。コンピュータ402は、たとえば、図1のプリンシパル102およびガード104または図2の層を実施するのに使用することができる。コンピュータ402の構成要素には、1つまたは複数のプロセッサまたは処理ユニット404(任意選択として1つまたは複数のセキュリティプロセッサまたはセキュリティコロセッサ(SSPなど)および/または1つまたは複数の暗号プロセッサまたは暗号コプロセッサを含む)、システムメモリ406、プロセッサ404を含むさまざまなシステム構成要素をシステムメモリ406に結合するシステムバス408を含めることができるが、これらに制限はされない。
【0303】
システムバス408は、メモリバスまたはメモリコントローラ、周辺バス、accelerated graphics port、およびさまざまなバスアーキテクチャのいずれかを使用するプロセッサバスまたはローカルバスを含む、複数のタイプのバスアーキテクチャのいずれかの1つまたは複数を表す。たとえば、そのようなアーキテクチャに、Industry Standard Architecture(ISA)バス、マイクロチャネルアーキテクチャ(MCA)バス、Enhanced ISA(EISA)バス、Video Electronics Standards Association(VESA)ローカルバス、および、メザニンバスとも称するPeripheral Component Interconnects(PCI)バスを含めることができる。
【0304】
コンピュータ402には、通常は、さまざまなコンピュータ可読媒体が含まれる。そのような媒体は、コンピュータ402によってアクセス可能な任意の使用可能な媒体とすることができ、そのような媒体には、揮発性媒体および不揮発性媒体、取外し可能媒体および取外し不能媒体の両方が含まれる。
【0305】
システムメモリ406には、ランダムアクセスメモリ(RAM)410などの揮発性メモリ、および/または読取専用メモリ(ROM)412などの不揮発性メモリの形のコンピュータ可読媒体が含まれる。起動中などにコンピュータ402内の要素の間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム(BIOS)414が、ROM412に保存される。RAM410には、通常は、プロセッサ404から即座にアクセス可能および/またはプロセッサ404によって現在操作されるデータおよび/またはプログラムモジュールが含まれる。
【0306】
コンピュータ402には、他の取外し可能/取外し不能、揮発性/不揮発性のコンピュータ記憶媒体も含めることができる。たとえば、図12に、取外し不能不揮発性磁気媒体(図示せず)から読み取り、それに書き込むハードディスクドライブ416、取外し可能不揮発性磁気ディスク420(たとえば「フロッピー(登録商標)ディスク」)から読み取り、それに書き込む磁気ディスクドライブ418、およびCD−ROM、DVD−ROM、または他の光学媒体などの取外し可能不揮発性光ディスク424から読み取り、かつ/またはそれに書き込む光ディスクドライブ422が示されている。ハードディスクドライブ416、磁気ディスクドライブ418、および光ディスクドライブ422は、それぞれ、1つまたは複数のデータ媒体インターフェース426によってシステムバス408に接続される。その代わりに、ハードディスクドライブ416、磁気ディスクドライブ418、および光ディスクドライブ422を、1つまたは複数のインターフェース(図示せず)によってシステムバス408に接続することができる。
【0307】
ディスクドライブおよびそれに関連するコンピュータ可読媒体によって、コンピュータ402の、コンピュータ可読命令、データ構造体、プログラムモジュール、および他のデータの不揮発性ストレージが提供される。この例には、ハードディスク416、取外し可能磁気ディスク420、および取外し可能光ディスク424が示されているが、磁気カセットまたは他の磁気記憶装置、フラッシュメモリカード、CD−ROM、ディジタル多用途ディスク(DVD)または他の光ストレージ、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、電気消去可能プログラマブル読取専用メモリ(EEPROM)、および類似物などの、コンピュータによってアクセス可能なデータを保存できる他のタイプのコンピュータ可読媒体を使用して、例示的なコンピューティングシステムおよび環境を実施することもできることを諒解されたい。
【0308】
たとえばオペレーティングシステム426、1つまたは複数のアプリケーションプログラム428、他のプログラムモジュール430、およびプログラムデータ432を含む、任意の数のプログラムモジュールを、ハードディスク416、磁気ディスク420、光ディスク424、ROM412、および/またはRAM410に保存することができる。そのようなオペレーティングシステム426、1つまたは複数のアプリケーションプログラム428、他のプログラムモジュール430、およびプログラムデータ432のそれぞれ(またはこれらのある組合せ)によって、分散ファイルシステムをサポートする常駐構成要素のすべてまたは一部を実施することができる。
【0309】
ユーザは、キーボード434およびポインティングデバイス436(たとえば「マウス」)などの入力装置を介してコンピュータ402にコマンドおよび情報を入力することができる。他の入力装置438(具体的には図示せず)に、マイクロホン、ジョイスティック、ゲームパッド、衛星放送送受信用パラボラアンテナ、シリアルポート、スキャナ、および/または類似物を含めることができる。これらおよび他の入力装置は、システムバス408に結合される入出力インターフェース440を介して処理ユニット404に接続されるが、パラレルポート、ゲームポート、またはuniversal serial bus(USB)などの他のインターフェースおよびバス構造によって接続することもできる。
【0310】
モニタ442または他のタイプの表示装置も、ビデオアダプタ444などのインターフェースを介してシステムバス408に接続することができる。モニタ442に加えて、他の出力周辺装置に、スピーカ(図示せず)およびプリンタ446など、入出力インターフェース440を介してコンピュータ402に接続することができる構成要素を含めることができる。
【0311】
コンピュータ402は、リモートコンピューティングデバイス448などの1つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。たとえば、リモートコンピューティングデバイス448を、パーソナルコンピュータ、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイスまたは他の一般的なネットワークノード、および類似物とすることができる。リモートコンピューティングデバイス448は、コンピュータ402に関して本明細書で説明する要素および特徴の多くまたはすべてを含めることができるポータブルコンピュータとして図示されている。
【0312】
コンピュータ402とリモートコンピュータ448の間の論理接続は、ローカルエリアネットワーク(LAN)450および一般的な広域ネットワーク(WAN)452として図示されている。そのようなネットワーキング環境は、オフィス、会社全体のコンピュータネットワーク、イントラネット、およびインターネットでありふれた物である。
【0313】
LANネットワーキング環境で実施される場合に、コンピュータ402は、ネットワークインターフェースまたはネットワークアダプタ454を介してローカルネットワーク450に接続される。WANネットワーキング環境で実施される場合に、コンピュータ402に、通常は、広域ネットワーク452を介する通信を確立するための、モデム456または他の手段が含まれる。モデム456は、コンピュータ402の内蔵または外付けとすることができるが、入出力インターフェース440または他の適当な機構を介してシステムバス408に接続することができる。図示されたネットワーク接続が、例示的であることと、コンピュータ402および448の間で通信リンクを確立する他の手段を使用できることを諒解されたい。
【0314】
コンピューティング環境400と共に図示された物などのネットワーク化された環境では、コンピュータ402に関して図示されたプログラムモジュールまたはその一部を、リモートメモリストレージデバイスに保存することができる。例として、リモートアプリケーションプログラム458が、リモートコンピュータ448の記憶装置に常駐する。例示のために、アプリケーションプログラムおよび、オペレーティングシステムなどの他の実行可能プログラムコンポーネントが、この図では別個のブロックとして図示されているが、そのようなプログラムおよびコンポーネントが、さまざまな時にコンピューティング装置402の異なるストレージ構成要素に常駐し、コンピュータのデータプロセッサによって実行されることを理解されたい。
【0315】
さまざまなモジュールおよび技法を、プログラムモジュールなど、1つまたは複数のコンピュータまたは他の装置によって実行されるコンピュータ実行可能命令の全般的な文脈で本明細書で説明することができる。一般に、プログラムモジュールには、特定の作業を実行するか特定の抽象データ型を実施する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造体などが含まれる。通常、プログラムモジュールの機能性は、さまざまな実施形態で望みに応じて組み合わせるか分散させることができる。
【0316】
これらのモジュールおよび技法の実施形態を、何らかの形のコンピュータ可読媒体に保存するか、それを介して伝送することができる。コンピュータ可読媒体は、コンピュータによってアクセス可能なすべての使用可能な媒体とすることができる。制限ではなく例として、コンピュータ可読媒体に、「コンピュータ記憶媒体」および「通信媒体」を含めることができる。
【0317】
「コンピュータ記憶媒体」には、コンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータなどの情報の記憶のためのあらゆる方法または技術で実施される、揮発性および不揮発性の、取外し可能および取外し不能の媒体が含まれる。コンピュータ可読媒体には、RAM、ROM、EEPROM、フラッシュメモリまたは他のメモリ技術、CD−ROM、ディジタル多用途ディスク(DVD)または他の光学記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶装置、または、所望の情報を保存するのに使用でき、コンピュータによってアクセスすることができる他の媒体が含まれるが、これに制限はされない。
【0318】
「通信媒体」は、通常は、搬送波または他のトランスポート機構など、変調されたデータ信号内でコンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータを実施する。通信媒体に、情報配送媒体も含まれる。用語「変調されたデータ信号」は、信号内に情報を符号化する形でその特性の1つまたは複数を設定または変更される信号を意味する。制限ではなく例として、通信媒体に、有線ネットワークまたは直接配線接続などの有線媒体と、音響、RF、赤外線、および他の無線媒体などの無線媒体が含まれる。上記の任意の組合せも、コンピュータ可読媒体の範囲に含まれる。
【0319】
上の説明では、構造的特徴および/または方法論的動作に固有の言語を使用したが、請求項で定義される発明が、記載された特定の特徴または動作に制限されないことを理解されたい。そうではなく、特定の特徴および動作は、本発明の実施の例示的形態として開示される。
【符号の説明】
【0320】
200 Seal動作を実施する例示的なプロセス
220 UnSeal動作を実施する例示的なプロセス
250 Store動作を実施する例示的なプロセス
270 Seal動作を実施する例示的なプロセス
300 Quote動作を実施する例示的なプロセス
320 Verify動作を実施する例示的なプロセス
340 PKUnseal動作を実施する例示的なプロセス
360 PKSeal動作を実施する例示的なプロセス
380 GenSeal動作を実施する例示的なプロセス
【技術分野】
【0001】
本発明は、データの保存および検索に関し、具体的には、対称鍵暗号化に基づくデータの保存および検索に関する。
【背景技術】
【0002】
コンピュータ上でデータを保護し、その結果、適当な当事者だけにデータが開示されるようにすることが、ユーザにとって重要な関心事になってきた。ユーザが保護を望むデータのタイプは、仕事関連のまたは個人的な機密文書、銀行口座番号、クレジットカード番号、社会保険番号など、さまざまである。さらに、不正な使用またはアクセスからユーザのコンピュータのデータを保護することが、ある第三者にとって重要である。たとえば、クレジットカード発行会社は、クレジットカード番号が保護され、その結果、コンピュータをハッキングする悪意のあるプログラムまたは当事者にその番号が開示されなくなることを望み、音楽会社は、コピーできないように音楽を保護することを望み、映画スタジオは、コピーできないように映画を保護することを望む。
【先行技術文献】
【非特許文献】
【0003】
【非特許文献1】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.
【発明の概要】
【発明が解決しようとする課題】
【0004】
コンピュータのデータを保護する解決策の1つが、汎用のコンピューティングデバイスを除去し、特殊目的の耐タンパボックスを、保護された内容の配布、保存、および表示に使用することである。しかし、この解決策は、ユーザが自分のコンピュータを拡張できなくなる(たとえば、ユーザが、そのような耐タンパボックスに追加のソフトウェアコンポーネントおよび/またはハードウェア構成要素をインストールできない)ので、望ましくない可能性がある。したがって、汎用コンピューティングデバイスでデータを保護できるようにする方法を提供することが有益である。
【課題を解決するための手段】
【0005】
本明細書では、対称鍵暗号化に基づくデータの保存および検索を開示する。
【0006】
一態様によれば、データが、呼出し側プログラムから受け取られる。データを含む暗号テキストが、対称暗号を使用して、1つまたは複数のターゲットプログラムだけが暗号テキストからデータを得られるようにすることができる形で生成される。
【0007】
もう1つの態様によれば、ビットストリングが、呼出し側プログラムから受け取られる。呼出し側プログラムの識別子を検査して、呼出し側プログラムが、ビットストリングの暗号テキスト内で暗号化されたデータにアクセスすることを許可されるかどうかを判定する。データの保全性も検証され、対称鍵を使用してデータが暗号解読(暗号化解除と称することがある)される。呼出し側プログラムがデータへのアクセスを許可され、データの保全性が成功裡に検証される場合に限って、データが呼出し側プログラムに返される。
【図面の簡単な説明】
【0008】
【図1】例示的なアクセス制御モデルを示す図である。
【図2】4つの異なる階層層を使用する例示的なアクセス制御環境を示す図である。
【図3】Seal動作を実施する例示的なプロセスを示す流れ図である。
【図4】UnSeal動作を実施する例示的なプロセスを示す流れ図である。
【図5】Store動作を実施する例示的なプロセスを示す流れ図である。
【図6】Seal動作を実施する例示的なプロセスを示す流れ図である。
【図7】Quote動作を実施する例示的なプロセスを示す流れ図である。
【図8】Verify動作を実施する例示的なプロセスを示す流れ図である。
【図9】PKUnseal動作を実施する例示的なプロセスを示す流れ図である。
【図10】PKSeal動作を実施する例示的なプロセスを示す流れ図である。
【図11】GenSeal動作を実施する例示的なプロセスを示す流れ図である。
【図12】本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境を示す図である。
【発明を実施するための形態】
【0009】
図1に、例示的なアクセス制御モデル100を示す。プリンシパル102が、保護されたリソースへのアクセスの要求を行うことができる。この要求は、ガード104によって受け取られ、ガード104は、リソース106へのアクセスを制御するコンポーネントである。ガード104は、要求を検査し、リソースのアクセスポリシならびに、要求を発行したプリンシパル102の識別などの他の情報に基づいて、要求を許可するかどうかを決定する。説明を簡単にするために、単一のプリンシパル102、ガード104、およびリソース106が図1に示されている。しかし、アクセス制御モデル100に、複数のプリンシパル102、複数のガード104、および/または複数のリソース106を含めることができることに留意されたい。
【0010】
プリンシパル102は、保護されたデータへのアクセスを要求するコンポーネントまたはモジュールを指す。この要求は、保護されたデータを検索する要求(たとえば、暗号鍵の検索の要求)、または保護されたデータを使用して動作を実行する要求(たとえば、保護されたデータを暗号鍵とすることができ、要求を、暗号鍵を使用する特定のデータの暗号化または暗号解読の要求とすることができる)とすることができる。プリンシパル102は、ハードウェア、ソフトウェア、ファームウェア、またはハードウェア、ソフトウェア、および/またはファームウェアの組合せで、コンポーネントまたはモジュールとして実施することができる。
【0011】
ガード104は、保護されたデータへのアクセスを制御するコンポーネントまたはモジュールを指す。ガード104は、保護されたデータに関連するアクセスポリシ、ならびに他の情報(保護された内容へのアクセスを要求するプリンシパルの識別など)を使用して、プリンシパルが保護されたデータにアクセスすることが許可されるかどうかを判定する。ガード104が、要求元のプリンシパルが保護されたデータへのアクセスを許可されると判定する場合には、ガード104は、適当な形で要求に応答する(たとえば、要求が、保護されたデータに関する要求である場合には、保護されたデータをプリンシパルに返し、要求が、保護されたデータを使用して特定のデータを暗号化する要求である場合には、ガード104は、保護されたデータを使用して特定のデータを暗号化し、暗号テキスト(暗号化されたデータ)をプリンシパルに返す)。ガード104が、要求の性質に基づいてプリンシパルを制限することができることに留意されたい。たとえば、ガード104は、特定のプリンシパルが保護されたデータを使用して特定のデータに署名させることを許可することができるが、保護されたデータをその特定のプリンシパルに返すことを許可しないことができる。
【0012】
ガード104は、開示ガードおよび/またはサービスガードとして特徴を表すこともできる。サービスガードは、プリンシパルからの要求の際に、保護されたデータ(たとえば暗号鍵)を開示せずに、保護されたデータを用いるある動作(たとえば、暗号化、暗号解読、ディジタル署名など)を実行する。その一方で、開示ガードは、許可された要求元に、保護されたデータを明らかにする。特定のガード104を、開示ガードおよびサービスガードの両方とすることができることに留意されたい。
【0013】
リソース106は、アクセスが制限されるすべてのタイプのデータとすることができる。リソース106の例には、暗号鍵、銀行口座番号、クレジットカード番号、社会保険番号などの個人情報、パスワードなどを含めることができる。リソース106は、コンピューティングデバイス内の事実上何にでもすることができる。たとえば、リソース106を、物理メモリ(たとえばRAMまたはROM)、光ディスク、磁気ディスク、光ディスクドライブ、磁気ディスクドライブ、ビデオカード、サウンドカード、スマートカードなどにすることもできる。もう1つの例として、リソース106を、プロセス、ファイル、スレッド、セマフォなどのオペレーティングシステム抽象化とすることもできる。
【0014】
本明細書の説明では、アクセス制御モデル100を、主に、単一のコンピューティングデバイスで実施される物に関して説明する。しかし、このモデルの異なる部分を、異なるコンピューティングデバイスで実施できることを諒解されたい。たとえば、プリンシパル102をあるコンピューティングデバイスに置き、ガード104およびリソース106を別のコンピューティングデバイスに置くことができる。
【0015】
あるコンピューティングデバイスのプリンシパルおよびガードを、任意の数nの階層層lnに分類することができる。図2に、4つの異なる階層層を使用する例示的なアクセス制御環境を示す。一実施形態では、層l1が、ハードウェア層またはセキュリティカーネル層を指し、層l2が、基本入出力システム(BIOS)層を指し、層3が、オペレーティングシステム(OS)層を指し、層4が、アプリケーション層を指す。
【0016】
図2の例の環境では、最下位層(層l1)が、ルートリソースを保護する。中間層(層l2およびl3)のプログラムは、次に下位の層にアクセスを要求するプリンシパルとして働くと同時に、次に上位の層のプリンシパルに向かってガードとして働く。したがって、中間層によって、上位層のプリンシパルに関する機能性を追加することができる。
【0017】
たとえば、プログラム120が、ガード126によって保護されるルートリソース128の検索を望むと仮定する。プログラム120は、モジュール122にルートリソース128へのアクセスを要求するプリンシパルとして働き、モジュール122は、そのリソースのガードとして働く。モジュール122が、リソース128のコピーを有する(たとえば、プログラム120または層l4の他のプログラムによるリソースに関する前の要求に応答して、またはモジュール122が初期化され、コンピューティングデバイスにロードされる場合に、ガード126から得た)場合に、モジュール122は、プログラム120がリソースを検索することを許可されるかどうかを検査する。その後、モジュール122は、プログラム120がリソースを検索することを許可される場合に、プログラム120にリソースを返す。
【0018】
しかし、モジュール122が、リソース128のコピーを有しない場合には、モジュール122は、モジュール124にルートリソースへのアクセスを要求するプリンシパルとして働き、モジュール124は、このリソースのガードとして働く。モジュール124が、リソース128のコピーを有する(たとえば、プログラム122または層l3の他のモジュールによるリソースに関する前の要求に応答して、またはモジュール124が初期化され、コンピューティングデバイスにロードされる場合に、ガード126から得た)場合に、モジュール124は、プログラム122がリソースを検索することを許可されるかどうかを検査する。その後、モジュール124は、プログラム122がリソースを検索することを許可される場合に、プログラム122にリソースを返す。その後、モジュール122は、プログラム120がリソースを検索することを許可される場合に、プログラム120にリソースを返す。
【0019】
しかし、モジュール124が、リソース128のコピーを有しない場合には、モジュール124は、ガード126にルートリソースへのアクセスを要求するプリンシパルとして働く。ガード126は、モジュール124がリソースの検索を許可されるかどうかを検査し、モジュール124がリソースの検索を許可される場合に、モジュール124にリソースを返す。モジュール124は、モジュール122がリソースの検索を許可される場合にモジュール122にリソースを返し、モジュール122は、プログラム120がリソースの検索を許可される場合にプログラム120にリソースを返す。
【0020】
本明細書の説明では、図1のアクセス制御モデル100を使用してソフトウェアの許可される動作を可能にすることに複数の場所で言及する。通常、ソフトウェアの許可された動作で保護されるリソースは、暗号鍵である。しかし、ソフトウェアの許可される動作が、アクセス制御モデル100の使用の1つの例にすぎないことを諒解されたい。
【0021】
アクセス制御モデル100の使用のもう1つの例が、コンピュータに対するユーザの認証である。ほとんどの近代のコンピュータが、アクセス制御システムを有する。ユーザは、コンピュータにログオンし、その結果、コンピュータが、そのユーザが誰であるかを知るようになる。ログオンの後に、ユーザは、通常はシステムリソースへのアクセスを必要とするプログラムを実行する(たとえば、ファイルの読取、画面上のウィンドウへの書込など)。通常、コンピュータのアクセス制御システムが、相談される(たとえば、「ユーザxがリソースzに対する動作yを実行できるか」)。回答が「否」の場合には、プログラムはリソースにアクセスできない。
【0022】
アクセス制御モデル100の使用のもう1つの例が、リモートサービスに対するユーザの認証である。ウェブサイト(たとえばオンラインブローカまたはオンライン銀行)などのリモートサービスは、アクセス制御システムを有するとみなすことができる。リソースは、人々の銀行口座、預金、および株式である。ユーザがウェブサイトにログオンした後に、アクセス制御システムは、そのユーザが、リソース「銀行口座データ」に対する「読取」アクセス(最新の銀行明細書を検索するため)またはリソース「銀行口座12345の1000ドル」への「振替」アクセスなど、ユーザによって要求されたアクセスを実行することを許可されるかどうかを判定する。
【0023】
アクセス制御モデル100の使用のもう1つの例が、特定の建物または区域への物理的アクセスの制限である。たとえば、ユーザが朝に職場に到着した場合に、そのユーザは、自分のバッジを提示し、リソース「フロントドア」に対する「開く」動作を要求する。ある電子システム(ガード)が、バッジに保存された情報に基づいて、そのユーザが建物に入ることを許可されるかどうかを判定し、それに応じてドアの鍵をはずす。
【0024】
コンピューティングデバイスは、プログラムが少なくとも1つの暗号リソースへの保護されたアクセス(開示ガードまたはサービスガードからの)を得られるようにすることが可能である場合に、プログラム(ソフトウェア)の認証された動作を可能にする。ある実施形態で、下で説明する認証および分離を可能にするコンピューティングデバイスが、認証された動作を可能にする。
【0025】
プログラムCを、別のプログラムDから分離されると言うことができるのは、2つの点すなわち、(1)プログラムCによってアクセスできるがプログラムDによってアクセスできないメモリがあり、(2)プログラムDが、プログラムCの実行を開始できない(おそらくはプログラムCによって決定されるエントリポイントを除いて)が満たされる場合である。プログラムは、その推移規則(実行可能コード)およびその初期状態(エントリポイントまたは命令ポインタIPの初期値)によって与えられる。第1の点によって、プログラムDによる敵対する挙動が存在する場合であっても、データをプログラムDによってアクセスできないメモリに保存することができるので、プログラムCのプログラムコードおよび状態情報の保全性が保証される。この点によって、プログラムCが、プログラムDによる観察から機密データ(たとえば暗号鍵)を保護できるようにもなる。第2の点によって、Dが、敵対する形でエントリポイントを選択することによってCの挙動を覆すことができないことが保証される。
【0026】
さらに、プログラムCが、プログラムDの推移規則(プログラムコード)および初期状態の両方を識別できる場合に、プログラムCが、プログラムDを認証できると言うことができる。コンピューティングデバイスは、iがプログラムCの層であるものとして、各層j<iについて、単一のプログラムEjを除いて、すべての他のプログラムDからの任意のプログラムCに関する分離を可能にする。これによって、プログラムCがそれを介してリソースへのアクセスを要求するガードのシーケンス、E1、E2、...、Ei-1を除くすべてのプログラムによる観察および干渉からプログラムが保護される。さらに、任意の層iについて、コンピューティングデバイスは、層iで実行中のプログラムが、層i+1内の少なくともいくつかのプログラムを認証できるようにする。この要件によって、プログラムが、次の層のプリンシパルからの要求に関するガードとして働けるようになる。この2つの観察によって、任意の層のプログラムが、前のプログラムにリソースへのアクセスを要求し、分離を介して保全性およびリソースを保護し、次の層のプリンシパルからの要求を認証をすることによって、リソースに関するガードとして働くことができるという誘導的な議論が与えられる。
【0027】
分離は、物理メモリ保護を使用することによって実施することができる。この手法を、「空間における分離」または「空間分離」と称する。たとえば、多くの近代のマイクロプロセッサにみられるリングメモリ保護および仮想メモリ保護は、空間における分離を実施するのに十分である。特権モードで動作するオペレーティングシステムカーネル(層i)は、アプリケーション(層i+1)のページテーブルをセットアップすることができ、すべてのアプリケーションが、物理メモリのうちで、オペレーティングシステムがそのアプリケーションの仮想アドレス空間にマッピングすることを選択した部分だけにアクセスできるようにする。さらに、カーネルは、アプリケーションがメモリマッピングを変更できないようにするためにアプリケーションの特権を制限し、アプリケーションが明確に定義されたエントリポイント(システム呼出し)でのみカーネルコードの実行を開始できることを保証する。
【0028】
2つの層の間の分離を実施するもう1つの手法が、その実行を時間的に分離することである。この手法を、「時間における分離」または「時間分離」と称する。第1層iのプログラムが、完了まで実行され、あるリソースを使用不能にし、その後、終了する。その後、制御が、次の層i+1に移される。
【0029】
認証は、後続の層(j=i+1)で行われる。プログラムCが、jの構成のプログラム(推移規則)および初期状態を認証する。プログラムは、プログラムCに層jのプログラムを検査させることによって認証することができる。すなわち、通常、プログラムCは、層jのプログラムが含まれるメモリを読み取り、このメモリ範囲に対する暗号ダイジェストを計算する。この点での目標が、コードに関して他のプリンシパルによって行われるステートメントの評価ではなく、コードの識別の確認だけであることに留意されたい。したがって、証明書は、この点では不要である。
【0030】
プログラムCの第2の仕事は、プログラムDの初期状態を識別することである。一般に、任意の実行段階でプログラムの初期状態を判定するという問題は、非常に困難である。したがって、プログラムCは、プログラムDの初期状態を制御する。現実的には、これは、プログラムCが、初期状態σでプログラムDの実行を開始する場合に、プログラムCが、プログラムDの初期状態σだけを確認できることを意味する。
【0031】
要約すると、プログラムDを認証するために、プログラムCは、関連するとみなされるメモリ内容(プログラムおよびおそらくはデータ)を検査し、暗号ダイジェストを計算する。その後、プログラムCが、プログラムDの明確に定義されたエントリポイントに実行を移す。
【0032】
リソースが暗号鍵である場合に、認証される動作によって、各オペレーティングシステムおよびアプリケーションプログラムが、1つまたは複数の秘密への排他的アクセスを有することが可能になる。上で述べた分離によって、敵対するコードによる攻撃から各秘密が保護される。上で述べたプログラムの認証によって、各秘密がそれを所有するプログラムだけに保持されるように、プログラムを識別できるようになる。
【0033】
一般に、プログラム(図1のプリンシパル102)からの要求に対して、ガード104は、プログラムの識別を確立する(すなわち、ガード104がプログラムを認証する)。プログラムが、要求された秘密(リソース106)の所有者でない場合には、ガード104が、その要求を拒否する。そうでない場合には、ガード104は、秘密および、おそらくは、さらに、プログラムによって供給されるさらなる情報のある関数(秘密自体とすることができる)を計算し、その結果を返す。代替案では、要求を明示的に受け入れるか拒否するのではなく、ガード104が、要求をサービスするが、呼出し側の識別を結果に束縛する。この代替手法は、たとえば、ガードによって返される結果に機密情報が含まれない場合(たとえば、秘密を使用してディジタル署名を作る要求)に適当である。用語ゲーティング機能は、本明細書で、この両方の事例を指すのに使用される。
【0034】
さらに、どちらの場合でも、ガード104は、呼出し側(プリンシパル102)を認証する。プリンシパル102の認証を、本明細書では、関数ID()とも称し、この関数は、呼出し側プログラム(ガード104のゲーティング機能を呼び出すプログラム)のダイジェストを返す。ダイジェストは、SHA1(Secure Hash Algorithm 1)、MD5(Message Digest 5)、MD2(Message Digest 2)などのさまざまな暗号ハッシュ関数(1方向ハッシュ関数とも称する)の1つまたは複数の使用、keyed MAC(メッセージ確認コード)の使用など、さまざまな従来の形のどれかで生成することができる。
【0035】
本明細書で説明するゲーティング機能の1つのクラスで、シールドストレージ(sealed strage)が実施される。シールドストレージの目的は、1つまたは複数のプログラムの特定の組(秘密を保存するプログラムによって定義される)だけが秘密を検索できるように、プログラムが秘密を保存できるようにすることである。1つの実施形態で、最初に秘密を保存した(封印(seal)した)プログラムだけが、その秘密を回復(封印解除(unseal))することができる。通常、これらの秘密の寿命は、プログラムの個々の実行の時間を超える。プログラムの単一の実行中に使用される秘密を、保存(封印)することができ、その代わりに、分離および乱数ジェネレータを用いて、プログラムが単一の実行中の秘密を維持できるようにする。シールドストレージによって、プログラムが、時間的にオーバーラップしない可能性がある、異なる実行にまたがって秘密を維持できるようになる。層liが、下記のインターフェースによって、次の層li+1にシールドストレージを公開する(たとえば、「Seal」動作および「UnSeal」動作および/またはPKSeal動作およびPKUnseal動作を使用して)。
【0036】
シールドストレージに関する本明細書の説明で、データの暗号化および暗号解読に使用される暗号鍵に言及する。これらの暗号鍵は、リソースへのアクセスを保護するガード(たとえば図1のガード104)に関連する鍵である。
【0037】
本明細書の説明で、プログラムの識別子(たとえば、動作を呼び出すプログラムの識別子、またはリソースへのアクセスを許可されたターゲットプログラムの識別子)に言及する。本明細書では、これらの識別子を、しばしばダイジェストと称する。しかし、ダイジェストが、プログラムの識別子の1例にすぎないことを諒解されたい。プログラムの測定または他の表現であり、プログラムに対するすべての変更を検出できる他のタイプの識別子を、使用することができる。プログラムに対して何らかの変更が行われる(たとえば、保護されたデータへのアクセスを悪意をもって取得し、そのデータを利用する試みで敵対者が1つまたは複数の命令を変更する)場合に、プログラムの識別子は、その変更を反映しなければならない(たとえば、変更されないプログラムの識別子が、変更されたプログラムの識別子と異なる)。
【0038】
Seal動作は、入力として、封印されるデータ(たとえば秘密)を受け取る。Seal動作は、任意選択として、秘密が明かされる(封印解除される)場合および/または相手を識別する条件を、入力として受け取る。一実施形態では、この条件が、データの検索(封印解除)を許可されるターゲットプログラムのダイジェストである。その代わりに、データの検索(封印解除)を許可されるプログラムを、他の形で識別することができる。たとえば、プログラムを、1つまたは複数の証明書を検証する公開鍵によって識別することができ、この証明書のそれぞれは、1つまたは複数のプログラムに関連する。
【0039】
その代わりに、他の条件を、ターゲットプログラムの識別子に加えてまたはその代わりに使用することができる。たとえば、条件に、その間に秘密を明かす(封印解除する)ことができる特定の時間または曜日など、データを明かす(封印解除する)ことができる時に関する時間制約を含めることができる。もう1つの例として、条件に、秘密を明かす(封印解除する)ために提供しなければならないパスワードまたは他のデータの識別子を含めることができ、たとえば、パスワードの知識を有するプログラムのみによって秘密を封印解除することができる。
【0040】
もう1つの例として、条件を、論理式(たとえば、一階論理で記述されたステートメント、術語論理で記述されたステートメントなど)とすることができる。その論理式が、評価され(たとえばガードによって)、その評価で真の表示が返される場合に限って、秘密が明かされる(封印解除される)。
【0041】
もう1つの例では、条件を、ある言語(たとえば、Java(登録商標)、C*、Java(登録商標)script、VBScriptなど)の実行可能プログラムとすることができる。プログラムが、実行され(たとえばガードによって)、プログラムが、「真」または「満足」の何らかの表示を返す場合に限って、秘密が明かされる(封印解除される)。
【0042】
条件が、ターゲットプログラムのダイジェストと共に供給されるのではなく、ターゲットプログラムのダイジェストである状況では、Seal動作で、Seal動作を呼び出すプログラムのダイジェストを使用することができる(これによって、ターゲットプログラムのダイジェストが暗黙のうちに入力される)。さらに、複数のターゲットプログラムのダイジェストを、Seal動作に入力することができ、これによって、複数のターゲットプログラムがデータを明かす(封印解除する)ことができるようになる。
【0043】
Seal動作では、その入力(データおよびデータの検索(封印解除)を可能にする条件)が、呼出し側の識別子と共に暗号化される。Seal動作では、暗号化された形で(暗号テキストとして)入力データが返される。Seal動作では、封印されたデータの保全性を検証するのに使用することができる値(たとえば、メッセージ確認コード(MAC)値)も返される。この返されるデータを用いると、下で詳細に説明するように、保存されたデータを後続のUnSeal動作で参照できるようになる。
【0044】
Seal動作の擬似コードを、表Iに示す。表Iの擬似コードでは、ID()が、上で説明したID()関数を指し、eが、呼出し側に返される値(たとえばビットのストリングまたはシーケンス)を指し、dataが、封印されるデータを指し、[t1、...、tm]が、データの検索(封印解除)を許可される1つまたは複数(m個)のターゲットプログラムのダイジェスト(または、1つまたは複数の他の条件)を指す。
表I
d=ID()
e= store {data, [t1, ..., tm], d)
return e
【0045】
図3は、Seal動作を実施する例示的なプロセス200を示す流れ図である。プロセス200は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0046】
まず、封印される秘密を呼出し側から受け取る(動作202)。秘密を暗号化し、その結果、秘密を、特定のターゲットプログラムだけによって検索できるようにするか(動作204)、その代わりに、秘密を、1つまたは複数の特定の条件が満足される場合に限って検索できるようにする。暗号化された秘密を含む暗号テキストを、呼出し側に返す(動作206)。呼出し側のあたいダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部として、または暗号テキストとは別に)。
【0047】
UnSeal動作では、呼出し側プログラムが現在検索を望むデータを封印した時にSeal動作によって返されたビットストリング(たとえば暗号鍵)を入力として受け取る。UnSeal動作では、データを明かす条件を入手し、その条件が満足されるかどうかを検査する。たとえば、条件に、データの検索(封印解除)を許可される1つまたは複数のターゲットプログラムのダイジェストが含まれる場合に、UnSeal動作では、これらのダイジェストを入手し、呼出し側プログラムが1つまたは複数のターゲットプログラムの1つであるかどうかを検査する。呼出し側プログラムが、1つまたは複数のターゲットプログラムの1つでない場合には、UnSeal動作が失敗し、要求されたデータは、呼出し側に返されない。しかし、呼出し側プログラムが、1つまたは複数のターゲットプログラムの1つである場合には、UnSeal動作が成功し、要求されたデータが、呼出し側プログラムに返される。データを封印したプログラムのダイジェストも、任意選択として、UnSeal動作から返される。
【0048】
UnSeal動作の擬似コードを表IIに示す。表IIの擬似コードでは、dataが、要求されている(前に封印された)データを指し、[t1、...、tm]が、データの検索(封印解除)を許可される1つまたは複数(m個)のターゲットプログラムのダイジェスト(または、1つまたは複数の他の条件)を指し、eが、UnSeal動作への入力(通常は、Seal動作による前の出力)を指し、dが、データを封印したプログラムのダイジェストを指す。
表II
(data, [t1, ..., tm], d) = retrieve(e)
if ID() is in [t1, ..., tm] then return (data, d)
else fail
【0049】
図4は、UnSeal動作を実施する例示的なプロセス220を示す流れ図である。プロセス220は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0050】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る(動作222)。呼出し側がデータの検索を許可されるかどうかを検査し(動作224)、呼出し側がデータの検索を許可されるかどうかに基づいて処理を進める(動作226)。呼出し側がデータの検索を許可される場合には、データ(暗号解読された)を呼出し側に返す(動作228)。呼出し側がデータの検索を許可されない場合には、処理が失敗し(動作230)、データは、呼出し側に返されない。
【0051】
シールドストレージを、異なる形で実施することができる。一実施形態では、シールドストレージが、物理的に保護された不揮発性メモリを使用して実施される。この実施形態では、コンピューティングデバイスが、保護された不揮発性メモリの異なる部分に異なるガードを関連付け、各ガードが、そのガードに関連付けられた部分だけにアクセスできるようにする。この実施形態では、Seal動作およびUnSeal動作で参照されるStore動作およびRetrieve動作が、コンピューティングデバイスに、ガードに関連する保護された不揮発性メモリ内のデータを、それぞれ保存させるか検索させるために呼び出される。
【0052】
たとえば、ストレージデバイス(ハードディスクドライブなど)によって、ガードを実施することができる。ストレージデバイスに対する読取コマンドおよび書込コマンドを無条件に単純に実行するのではなく、ストレージデバイスが、そのストレージデバイスへのアクセスを試みるプリンシパルを識別し(たとえば、プリンシパルのダイジェストに基づいて)、特定のプリンシパルだけにそのストレージデバイスへのアクセスを許可する。代替案では、異なるプリンシパルを、ストレージデバイスの特定の部分(たとえば、特定のセクタまたはアドレス範囲)だけへのアクセスに制限することができる。
【0053】
もう1つの実施形態では、シールドストレージが、暗号を使用して実施される。暗号を使用するシールドストレージの1つの例示的な実施形態の説明を続ける。
【0054】
暗号を使用してシールドストレージを実施する場合に、リソースは、物理的に保護されるメモリではなく、鍵Kである。Store動作では、その入力が物理的に保存されない。そうではなく、Store動作では、暗号的に保護された出力cが作られ、この出力cが、暗号化され保全性を保護された形でのStore動作の入力になる。暗号化は、入力に対称暗号を適用した結果である。後者のプロパティは、入力(入力を暗号化する前または後のいずれか)にメッセージ確認コード(MAC)を適用することから生じる。
【0055】
Store動作の擬似コードを、表IIIに示す。表IIIの擬似コードでは、bが、Store動作に入力されるビットストリングを指し、cが、Store動作によって出力されるビットストリングを指し、K1が、鍵Kの第1部分を指し、K2が、鍵Kの第2部分を指す。鍵KはSeal動作およびStore動作を実施するガードの対称鍵である。
表III
m = MACK1(b)
c = (m, EncryptK2(b))
return c
【0056】
したがって、表IIIからわかるように、値(m)は、Store動作に入力されるビットストリングにMACを適用することによって生成される。MACは、鍵Kの部分(K1)を鍵とする。また、保存動作に入力されるビットストリングは、鍵Kの第2部分(K2)を使用して暗号化される。入力ビットストリングにMACを適用すること、および入力ビットストリングを暗号化することによって生成された値が、Store動作の呼出し側に返される。
【0057】
鍵Kは、MACと暗号に同一の鍵を使用しないようにするために、2つの独立の鍵K1およびK2に区分される。この区分は、さまざまな形のいずれかで実行することができる。区分では、鍵Kの異なるビットを使用するか、その代わりに、1つまたは複数の同一のビットを使用することができる。たとえば、鍵Kが1024ビットであると仮定すると、下位512ビットを鍵K1として使用し、上位512ビットを鍵K2として使用することができ、偶数番目のビット(ビット0、2、4、6、8、10、...、1022)を鍵K1として使用し、奇数番目(ビット1、3、5、7、9、11、...、1023)を鍵K2として使用することができ、下位650ビットを鍵K1として使用し、上位650ビットを鍵K2として使用することができる(いくつかのビットがK1およびK2の両方に使用されることになる)。その代わりに、同一の鍵KをMACおよび暗号の両方に使用することができる。
【0058】
表IIIに示された擬似コードでは、データに対してMACを計算し、MACを暗号化し、暗号化されたMACを出力することによって、Store動作が実施される。その代わりに、Store動作を異なる形で実施することができる。たとえば、Store動作で、まずデータを暗号化し、次に暗号テキストに対するMACを計算し、暗号テキストおよびMACの両方を出力することができる。もう1つの例として、Store動作で、データに対するMACを計算し、データおよびMACの両方を暗号化し、暗号テキストを出力することができる。
【0059】
Store動作の暗号によって実行される暗号化は、さまざまな対称暗号化アルゴリズムのいずれかを使用して実行することができる。一般に、対称暗号化アルゴリズムでは、暗号化および暗号解読の両方に同一の鍵が使用される。そのようなアルゴリズムの例に、triple−DES(Data Encryption Standard、データ暗号化規格)、AES(Advanced Encryption Standard)などが含まれる。
【0060】
同様に、MACは、さまざまなメッセージ確認コードのいずれか(たとえば、非特許文献1参照)とすることができる。代替案では、MACの代わりに公開鍵ディジタル署名によって保全性を保護することができる。
【0061】
図5は、Store動作を実施する例示的なプロセス250を示す流れ図である。プロセス250は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0062】
まず、保存されるデータを受け取る(動作252)。対称暗号をデータに適用し(動作254)、メッセージ確認コード(MAC)をデータに適用する(動作256)。動作254で生成された暗号化されたデータ、および動作256で生成されたMAC値を呼出し側に返す(動作258)。
【0063】
Retrieve動作では、MAC値および暗号テキストを含むビットストリングを入力として受け取る。暗号テキストを暗号解読して、平文を生成し、その平文のMAC値を生成する。平文について生成されたMAC値が、入力ビットストリングの一部として受け取ったMAC値と同一である場合には、平文を呼出し側に返す。しかし、平文について生成されたMAC値が、入力ビットストリングの一部として受け取ったMAC値と同一でない場合には、Retrieve動作が失敗し、平文は呼出し側に返されない。入力ビットストリングからMACおよび暗号テキストを得るためにRetrieve動作が実施される特定の形が、Store動作が実施される形に依存することを諒解されたい。
【0064】
Retrieve動作の擬似コードを、表IVに示す。表IVの擬似コードでは、cが、Retrieve動作に入力されるビットストリングを指し、bが、Retrieve動作によって出力されるビットストリングを指し、mが、Retrieve動作に入力されたビットストリングのMAC値部分を指し、dが、Retrieve動作に入力されたビットストリングの暗号テキスト部分を指し、K1が、鍵Kの第1部分を指し、K2が、鍵Kの第2部分を指す。K1鍵およびK2鍵は、鍵Kのうちで、Store動作に関して上で説明した物と同一の部分である。
表IV
Let (m, d) = c
b = DecryptK2(d))
if m = MACK1(b) then return b
else fail
【0065】
したがって、表IVからわかるように、値(b)は、Retrieve動作に入力されたビットストリングを暗号解読することによって生成される。その後、MAC値が、値(b)について生成される。Retrieve動作によって生成されたMAC値が、Retrieve動作に入力されたビットストリングの一部として受け取られたMAC値と同一である場合には、値(b)をRetrieve動作の呼出し側に返し、そうでない場合には、Retrieve動作が失敗する。
【0066】
表IVの擬似コードは、データに対するMACを計算し、データを暗号化し、MACおよび暗号テキストを一緒に出力する(これがRetrieve動作の入力ビットストリングとして働く)Store動作の実施形態に基づく。Store動作が、まずデータを暗号化し、暗号テキストに対するMACを計算し、暗号テキストおよびMACの両方を出力するように実施される場合には、Retrieve動作は、暗号テキストのMACを計算し、それを入力ビットストリングの一部として受け取られたMAC値と比較し、MAC値が一致する場合に暗号テキストを暗号解読し、暗号解読されたデータを返すように実施される。Store動作が、データに対するMACを計算し、データおよびMACの両方を暗号化するように実施される場合には、Retrieve動作は、入力ビットストリングを暗号解読し、入力ビットストリングのデータに対するMACを計算し、計算されたMACを暗号解読されたストリングのMAC値と比較し、MAC値が一致する場合にデータを返すように実施される。
【0067】
Store動作に関する上の説明と同様に、さまざまな暗号解読アルゴリズムのどれであっても、Retrieve動作に使用することができる。しかし、暗号解読アルゴリズムは、暗号化されたデータを暗号解読できるようにするために、暗号化アルゴリズムに対応しなければならない。同様に、さまざまなメッセージ確認コードのどれでも、MACとして使用することができるが、メッセージ確認コードは、Store動作によって使用されるメッセージ確認コードと同一でなければならない。
【0068】
図6は、Seal動作を実施する例示的なプロセス270を示す流れ図である。プロセス270は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0069】
まず、暗号テキストおよびMAC値を受け取る(動作272)。暗号テキストを暗号解読して、平文データを生成する(動作274)。メッセージ確認コード(MAC)を平文データに適用して、MAC値を生成し(動作276)、動作276で生成されたMAC値が動作272で受け取ったMAC値と等しいかどうかを検査する(動作278)。その後、処理は、生成されたMAC値が受け取ったMAC値と等しいかどうかに基づいて進行する(動作280)。生成されたMAC値が受け取ったMAC値と等しい場合には、平文データを呼出し側に返す(動作282)。しかし、生成されたMAC値が受け取ったMAC値と等しくない場合には、処理が失敗し(動作284)、平文データは呼出し側に返されない。
【0070】
したがって、シールドストレージに対する暗号手法では、値c(Store動作の出力)のすべての破壊を検出できること、および値b(Store動作への入力)を、鍵K2(値bを暗号化するために暗号によって使用される鍵)にアクセスできなければ検索できないことが、実質的に保証される。
【0071】
ゲーティング機能のもう1つのクラスでは、リモート認証が実施される。リモート認証の目的は、認証機能への強い物理的結合(たとえばサーバまたはスマートカードを使用する)がない場合であってもプログラムを認証できるようにすることである。この状況では、認証は、暗号に基づく。すなわち、両方の実体が、暗号認証プロトコルを介して進む。これには、秘密へのアクセスを有する認証された構成が含まれ、この秘密は、プロトコルに依存するが、通常は秘密鍵または対称鍵である。さらに、コンピューティングデバイスは、この認証秘密の使用を、その使用を要求する構成(たとえば、プロセッサおよび/またはソフトウェア)の識別に結び付けることができる。したがって、認証機能は、コンピューティングデバイスならびにその上で実行されるソフトウェアの識別を確立することができる。
【0072】
2つの動作、Quote動作およびPKUnseal動作が、公開鍵署名および秘密鍵暗号解読のめいめいのゲーティング機能である。これらのゲーティング機能を実施するガードは、署名鍵Ksおよび暗号解読鍵Kdにアクセスできる。署名鍵Ksおよび暗号解読鍵Kdの両方を、公開/秘密鍵対の秘密鍵とも称する。この公開/秘密鍵対は、Quote動作およびPKUnseal動作を実施するガードの鍵対である。
【0073】
Quote動作は、Quote動作への入力、および秘密を明かすことができる場合および/または相手を識別する条件の組合せ(たとえば連結)に対する公開鍵署名を返す。上で説明したSeal動作およびUnSeal動作に似て、秘密を明かすことを、さまざまな条件のどれにでも結び付けることができる。一実施形態では、条件が、呼出し側プログラムの識別子(たとえばダイジェスト)である。
【0074】
署名に固有なのが、動作が、識別される呼出し側プログラムの要求で実行されるという断定である。Quote動作は、Verify動作と共に働き、Verify動作は、通常は、Quote動作が実行されるデバイス以外のデバイスで(たとえば、リモートサーバデバイスで、スマートカードでなど)実行される。Verify動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子(および/または秘密を明かす他の条件)を検索し、評価する。
【0075】
Quote動作の擬似コードを、表Vに示す。表Vの擬似コードでは、ID()が、上で説明したID()関数を指し、aが、Quote動作に入力されるデータを表し、Ksが、署名鍵を指す。
表V
d =ID()
return sn=SignatureKs(d, a)
【0076】
したがって、表Vからわかるように、Quote動作では、呼出し側プログラムのダイジェストを入手し、入力値aを受け取る。Quote動作では、入力値aおよび呼出し側プログラムのダイジェストの、署名鍵Ksを使用するディジタル署名(sn)を生成する。入力値aは、呼出し側プログラムが生成することができ、その代わりに、別のコンポーネントまたはデバイスから(たとえば、Verify動作を実行するデバイスから)受け取られる値とすることができる。ディジタル署名は、公開鍵暗号を使用して生成される。
【0077】
図7は、Quote動作を実施する例示的なプロセス300を示す流れ図である。プロセス300は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0078】
まず、入力データを呼出し側から受け取る(動作302)。呼出し側の識別子(および/または入力データの検索に関する1つまたは複数の他の条件)を入手し(動作304)、入力データおよび呼出し側の識別子(および/または1つまたは複数の他の条件)の組合せに対するディジタル署名を生成する(動作306)。その後、生成されたディジタル署名を呼出し側に返す(動作308)。
【0079】
Verify動作では、公開鍵署名検証を実行し、呼出し側プログラムの識別子を検索し、評価する。Verify動作では、通常はVerify動作が実行されるデバイス以外のデバイス(たとえば、リモートサーバデバイス、スマートカードなど)から、Quote動作によって生成されたディジタル署名を受け取る。Verify動作では、受け取ったディジタル署名から、Quote動作を呼び出したプログラム(たとえば、アプリケーションプログラム、オペレーティングシステム、ファームウェアプログラムなど)のダイジェストを抽出し、そのダイジェストを評価して、進行方法を決定する。
【0080】
Verify動作の擬似コードを、表VIに示す。表VIの擬似コードでは、dが、Quote動作を呼び出したプログラムのダイジェストを指し、aが、Quote動作に入力された値を指し、Snが、Verify動作によって入力として受け取られたディジタル署名を指す。
表VI
(d,a)=ExtractKv(Sn)
Evaluate(d)
【0081】
したがって、表VIからわかるように、Verify動作では、ディジタル署名を受け取り、検証鍵Kv(署名鍵Ksを含む公開/秘密鍵対の公開鍵)を使用して、署名からダイジェストdおよび値aを抽出する。その後、Verifyプログラムでは、Quote動作を呼び出したプログラムのダイジェストdを評価することができる。ダイジェストdを評価する形は、変更することができる。たとえば、評価に、ダイジェストdを、「承認された」または「信頼される」アプリケーションプログラムのリストと比較することを含めることができる。
【0082】
図8は、Verify動作を実施する例示的なプロセス320を示す流れ図である。プロセス320は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0083】
まず、ディジタル署名を受け取る(動作322)。入力値を引用した(Quote動作を使用した)呼出し側の識別子(および/または入力値の検索に関する1つまたは複数の他の条件)および入力値自体の両方を、ディジタル署名から抽出する(動作324)。呼出し側の識別子(および/または1つまたは複数の他の条件)を評価して、入力値に関して進行する方法を決定する(動作326)。
【0084】
PKUnseal動作は、公開鍵暗号解読の、呼出し側の識別(たとえば呼出し側プログラムのダイジェスト)またはその代わりに1つまたは複数の他の条件に対してゲーティングされる版である。PKUnseal動作への入力cの公開鍵暗号解読の結果は、対(d、s)として解釈され、ここで、sは、秘密であり、dは、それに対してsを明かすことができる構成(たとえば、呼出し側プログラムのダイジェスト)を識別する。PKUnsealの呼出し側が、dでない場合には、PKUnseal動作が失敗する。PKUnseal動作への入力cは、PKUnseal動作が実行されるデバイス以外のデバイス(たとえば、リモートサーバデバイス、スマートカードなど)で実行することができる第2の動作PKSealによって生成される。PKSeal動作では、対(d、s)の公開鍵暗号化を実行する。PKUnseal動作およびPKSeal動作は、シールドストレージの実施にも使用することができる。
【0085】
PKUnseal動作の擬似コードを、表VIIに示す。表VIIの擬似コードでは、ID()が、上で説明したID()関数を指し、cが、PKUnseal動作への入力を指し、[d1、...、dm]が、それに対してsを明かすことができる1つまたは複数の呼出し側プログラムのダイジェスト(または、その代わりに1つまたは複数の他の条件)を指し、sが、保護されたデータを指し、Kdが、暗号解読鍵(PKUnseal動作を実施するガードに関連する公開/秘密鍵対の秘密鍵)を指す。
表VII
([d1, ..., dm], s) = DecryptKd(c)
if ID() is in [d1, ..., dm] then return s
else fail
【0086】
したがって、表VIIからわかるように、PKUnseal動作では、公開鍵暗号解読および暗号解読鍵Kdを使用して入力値cを暗号解読する。暗号解読された入力値には、保護されたデータsがそれに明かされることを許可される1つまたは複数の呼出し側プログラムのダイジェスト[d1、...、dm](または、その代わりに保護されたデータsを明かすことが許可される場合および/または相手を識別する1つまたは複数の条件)が含まれる。PKUnseal動作では、呼出し側プログラムのダイジェストも生成される。呼出し側プログラムのダイジェストが、ダイジェスト[d1、...、dm]の1つと等しい場合には、保護されたデータsが、呼出し側プログラムに返される。しかし、呼出し側プログラムのダイジェストが、ダイジェスト[d1、...、dm]のどれとも等しくない場合には、保護されたデータsは、呼出し側プログラムに返されない。
【0087】
図9は、PKUnseal動作を実施する例示的なプロセス340を示す流れ図である。プロセス340は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0088】
まず、呼出し側が検索を望む暗号化されたデータを含む暗号テキストを受け取る(動作342)。呼出し側がそのデータの検索を許可されるかどうかに関する検査を行い(動作344)、呼出し側がそのデータの検索を許可されるかどうかに基づいて処理を進める(動作346)。呼出し側がそのデータの検索を許可される場合には、データ(公開鍵暗号解読を使用して暗号解読された)を呼出し側に返す(動作348)。呼出し側がそのデータの検索を許可されない場合には、処理が失敗し(動作350)、データは、呼出し側に返されない。
【0089】
PKSeal動作は、公開鍵暗号化の、呼出し側の識別(たとえば、呼出し側プログラムあるいは1つまたは複数の他のプログラムのダイジェスト)に基づいてゲーティングされる版である。PKSeal動作では、対(d、s)の公開鍵暗号化を実行し、ここで、sは、秘密であり、dは、それに対してsを明かすことができる1つまたは複数の構成(たとえば、呼出し側プログラムのダイジェスト)を識別する。
【0090】
PKSeal動作の擬似コードを、表VIIIに示す。表VIIIの擬似コードでは、cが、PKSeal動作の出力を指し、[d1、...、dm]が、それに対してsを明かすことができる1つまたは複数の呼出し側プログラムのダイジェストを指し、sが、保護されたデータを指し、Keが、暗号化鍵を指す。
表VIII
c=EncryptKe([d1, ..., dm], s)
return c
【0091】
したがって、表VIIIからわかるように、PKSeal動作では、入力として、保護されたデータs、および保護されたデータsをそれに対して明かすことができる1つまたは複数のプログラムのダイジェスト[d1、...、dm]を受け取る。対[d1、...、dm]、sを、暗号化鍵Keに基づく公開鍵暗号を使用して暗号化する。暗号化鍵Keは、暗号テキストを暗号解読できることが意図されたガードの公開鍵である。公開鍵暗号化から生じる暗号テキストを、呼出し側プログラムに返す。
【0092】
図10は、PKSeal動作を実施する例示的なプロセス360を示す流れ図である。プロセス360は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0093】
まず、封印する秘密を呼出し側から受け取る(動作362)。秘密を公開鍵暗号化を使用して暗号化し、その結果、特定のターゲットプログラムだけが秘密を検索できるようにするか(動作364)、その代わりに、1つまたは複数の他の条件が満たされる場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す(動作366)。呼出し側のダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部としてまたは暗号テキストと別に)。
【0094】
Quote動作およびPKUnseal動作は、公開鍵認証プロトコルと共に使用されることを意図されている。ほとんどの公開鍵認証プロトコルは、公開鍵暗号解読、公開鍵暗号化、署名、および署名検証への呼出しのすべてを、それぞれPKUnseal、PKSeal、Quote、およびVerifyに置換することによって簡単に適合させることができる。
【0095】
いくつかの状況で、乱数を得られることが重要である(たとえば、暗号鍵生成の基礎として)。乱数は、さまざまな異なる形で得ることができる。一実施形態では、乱数の供給源が、コンピューティングデバイスのハードウェアで実施される、暗号的に強い乱数ジェネレータである。
【0096】
上で説明したSeal動作の代替案の1つが、Seal動作を乱数生成動作と組み合わせたGenSeal動作である。GenSeal動作では、入力として、秘密を検索することができなければならないターゲットプログラムのダイジェスト[t1、...、tm](および/または秘密を検索するために満足されなければならない他の条件)を受け取る。GenSeal動作では、乱数を生成し、新たに生成された乱数を封印し、その結果、新たに生成された乱数を、ターゲットダイジェスト[t1、...、tm](および/または満足される他の条件)の1つを有する呼出し側プログラムだけが検索できるようにする。
【0097】
GenSeal動作の擬似コードを、表IXに示す。表IXの擬似コードでは、ID()が、上で説明したID()関数を指し、cが、GenSeal動作の出力を指し、sが、新たに生成される乱数を指し、[t1、...、tm]が、値sを検索することが許可されなければならない1つまたは複数のターゲットプログラム(そのうちの1つを、任意選択として、GenSeal動作を呼び出すプログラムにすることができる)あるいはその代わりに1つまたは複数の他の条件を指し、GenRandom()が、乱数を生成する関数を指す。
表IX
d =ID()
s =GenRandom()
c = store (s, [t1, ..., tm], d)
return c
【0098】
図11は、GenSeal動作を実施する例示的なプロセス380を示す流れ図である。プロセス380は、図1のガード104によって実行され、ハードウェア、ソフトウェア、ファームウェア、またはその組合せで実施することができる。
【0099】
まず、秘密を検索できなければならないターゲットプログラムまたはその代わりに秘密を検索するために満足されなければならない1つまたは他の条件を識別する入力を呼出し側から受け取る(動作382)。秘密を生成し(動作384)、秘密を暗号化し、その結果、識別されたターゲットプログラムだけが秘密を検索できるようにする(動作386)か、その代わりに1つまたは他の条件が満足される場合に限って秘密を検索できるようにする。暗号化された秘密を含む暗号テキストを呼出し側に返す(動作388)。呼出し側のダイジェストおよび/またはターゲットプログラムのダイジェストなどの追加情報も、呼出し側に返すことができる(暗号テキストの一部としてまたは暗号テキストと別に)。
【0100】
開示ガードによって供給されるサービスを、汎用封印サービスに使用することができる。たとえば、図1および2に戻ると、層n−1によって、初期化の際の(たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり)層nの識別に基づいて、層nに単一の鍵が開かされる。層nは、この鍵をキャッシュに入れ、これを使用して追加の秘密を暗号化する。このプラットフォームが同一の構成で次にブートされる時に、開示ガードが、同一のルート鍵を供給し(たとえば、UnSealまたはPKUnsealを介して)、前に暗号化されたすべての秘密を、層nによって検索できる。
【0101】
いくつかの実施形態で、次の層が初期化される時(たとえば、コンピューティングデバイスのリセットまたはブートの後、あるいはプログラムの実行の始まり)に、その、次の層に、下位の層によって1つまたは複数の秘密が開示される。このゲーティングされる開示の後に、下位の層は、もはや使用されなくなる(次のブートまたはリセットまで)。この使用モデルを、開示ガードモデルとも称する。開示ガードモデルを使用することによって、下位層へのアクセスが減る。
【0102】
本明細書で説明するゲーティング機能は、時間分離および空間分離を使用して実施されるサービスガードおよび開示ガードと共に使用することができる。認証動作に関する4つのサービスモデル実施形態すなわち、(1)サービスガード−空間分離、(2)開示ガード−空間分離、(3)開示ガード−時間分離、および(4)サービスガード−時間分離を下で説明する。これらのサービスモデルの説明では、下位ガードが、検討される層のガードに1つまたは複数の鍵を開示したと仮定する。これらの鍵を入手する形は、下の層のガードおよび分離のモデルに依存する。同一のコンピューティングデバイスの異なる層で、これらのサービスモデルの異なる1つを使用することができる。
【0103】
(1)サービスガード−空間分離:ガードが、初期化される場合に要求元プログラムの識別を測定し、保存する。ガードは、プロセッササービス(たとえばCPUあるいは他のセキュリティプロセッサまたはセキュリティコプロセッサの)を使用する保護システム、および認証された動作プリミティブ動作を公開するシステム呼出しインターフェースを実施する。
【0104】
(2)開示ガード−空間分離:ガードが、暗号blobの形で初期化時にサービス要求を得る。blobは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、それ自体およびそれの秘密リソースに関するモード−保護を確立する。
【0105】
(3)開示ガード−時間分離:ガードが、暗号blob(ビットのグループ)の形で初期化時にサービス要求を得る。blobは、メモリに保存するか、その代わりに外部ストレージデバイスから得ることができる。ガードは、それが初期化するプログラムの識別を測定し、上で説明したゲーティング機能に従ってプログラムに鍵を開示する。次の層に制御を渡す前に、ガードは、ゲーティング機能を実施するのに使用される鍵を削除(または他の形でアクセス不能に)する。
【0106】
(4)サービスガード−時間分離:サービスガード−時間分離モデルでは、コンピューティングデバイスが、セキュリティリセットにまたがって、プログラム状態を安全に保存する。このモデルは、モデル(1)(サービスガード−空間分離)に類似するが、制御を次の層に渡す前に、サービスガードが、その秘密を削除する(次のリブートまで機能しないようにする)。次の層は、ガードにサービスを要求する必要が生じるまで、普通に実行される。必要になった時点で、次の層は、要求のパラメータを、メモリのうちでリセットに耐える場所に保存し、リセットを実行する。デバイスがリブートする際に、サービスガードが、その秘密を入手し、要求を見、それを実行し(鍵を使用して)、鍵および関連する情報を破壊し、計算の結果および制御を次の層(最初にサービスを要求した層)に渡す。
【0107】
いくつかの実施形態で、コンピューティングデバイスが、空間分離をサポートする場合に、セキュリティカーネルが、プリミティブ(動作)Seal、Unseal、GetRandom(乱数を得るため)、およびPKUnseal(またはQuote)を公開しなければならない。セキュリティカーネルで、開示ガードまたはサービスガードを実施することができる。その一方で、プラットフォームが時間分離をサポートする場合に、セキュリティカーネルが、開示ガードを提供しなければならず、プリミティブ(動作)Unseal、GenSeal、およびPKUnseal(またはQuote)を実施しなければならない。
【0108】
QuoteおよびPKUnsealの機能性を、SealプリミティブおよびUnsealプリミティブまたはUnsealプリミティブおよびGenSealプリミティブに基づいて構築できることにも留意されたい。たとえば、製造業者は、QuoteまたはPKUnsealを実施し、l1で実施されるGenSealおよびUnsealに基づく上位ソフトウェア(たとえばオペレーティングシステム)のホストとして働くl2プログラムを構築することができる。製造業者は、サービス層が必要とする鍵を生成し、Sealし、デバイスまたはCPUと共に出荷する(またはオンラインで使用可能にする)ことができる。
【0109】
プラットフォームが認証された動作をサポートできるようにする、ハードウェア実施形態の系列の例示的な説明を続ける。システムの上位層と同様に、下位層(図2のl1)の特性は、(a)秘密の鍵リソース、(b)これらの鍵にアクセスできる特権コード、および(c)層の制御された初期化である。
【0110】
認証される動作によって、プログラムと秘密の鍵の間の強い束縛が提供される。上位層では、下位層のガードによって、この束縛が保証される。下位層では、プラットフォームの秘密へのアクセスをゲーティングできる、基礎となるソフトウェアガードがない。したがって、l1プログラムへのl1鍵の関連付けをサポートするために、別の機構が使用される。この束縛を達成する方法の1つが、l1ソフトウェアを、製造後に変更できないプラットフォームマイクロコードまたはファームウェアにし、l1ソフトウェアに、l1鍵への制限されないアクセスを与えることである。このプラットフォームマイクロコードまたはファームウェアを、セキュリティカーネルと呼ぶことができ、l1鍵を、プラットフォーム鍵と称する。プラットフォームは、所定のセキュリティカーネルだけに制御を渡すように設計される。このハードウェア挙動を、プラットフォーム鍵を事前定義のセキュリティカーネルに開示する単純なリソースガードと説明することもできる。
【0111】
プラットフォーム鍵およびセキュリティカーネルファームウェアは、プロセッサの一部とするか、その代わりに、コンピューティングデバイスの1つまたは複数の他のコンポーネント(たとえば、暗号動作も実行できるセキュリティプロセッサまたはセキュリティコプロセッサ)で実施することができる。プラットフォーム鍵およびセキュリティカーネルファームウェアは、単一のコンポーネントで実施するか、その代わりにコンピューティングデバイスの複数のコンポーネントで実施することができる。
【0112】
認証された動作を用いると、プログラムが、制御された初期状態で開始される。上位レベルでは、下位レベルで動作するソフトウェアを信頼して、正しいエントリポイントで実行を開始することができる。しかし、l1では、ハードウェアがこの機能を実行する。通常、電源投入時またはリセットの後に、現在のプロセッサは、ある決定論的なシーケンスに従うことによって実行を開始する。たとえば、最も単純な場合に、プロセッサは、アーキテクチャ的に定義されたメモリ位置からコードをフェッチし、実行する。l1について、セキュリティカーネルがスタートアップ時に実行されるコードである(決定論的シーケンスの一部として)ことをハードウェアが保証することによって、プログラムを、制御された初期状態で開始することができる。
【0113】
さらに、他のプラットフォーム状態によって、セキュリティカーネルの実行を破壊できてはならない。リセットおよび電源投入によって、堅牢で確実にデバッグされた状態がプロセッサに明瞭にされなければならない。この例で使用される際に、セキュリティカーネルの開始または呼出しに使用されるプラットフォーム状態変化を、セキュリティリセットと称する。
【0114】
さらに、デバイス製造業者は、SealおよびUnsealのl1実装によって使用されるプラットフォーム鍵の生成またはインストールを配置しなければならない。デバイスが、PKI(公開鍵インフラストラクチャ)の一部として認識されなければならない場合には、製造業者は、プラットフォームの公開鍵の証明も行わなければならない。これは、l1によって直接に使用されるプラットフォーム鍵とするか、その代わりに上位層によって使用される鍵とすることができる。
【0115】
鍵の生成および証明は、CPU製造業者の責任とするか、その代わりにCPUをデバイスに組み立てるOEMなどの第三者の責任とすることができる。その代わりに、この責任を、複数のそのような当事者が共有することができる。
【0116】
セキュリティカーネルが実行されているならば、そのセキュリティカーネルが、上で説明した分離機構を使用して、上位層で実行されるコードからそれ自体を保護することができる。空間における分離には、通常は、特権モードサポートが含まれ、時間における分離には、通常は、上位層から隠される秘密が含まれる。
【0117】
ほとんどの現在のプロセッサでは、空間分離をサポートするための追加のプラットフォームサポートは不要である。すなわち、既存の特権モードまたはレベルで十分である(プラットフォーム鍵へのアクセスを許可するハードウェアリソースを上位層から保護できる限り)。
【0118】
時間分離をサポートするために、ハードウェアの援助を使用して、セキュリティカーネルが、上位層に制御を渡す前にプラットフォーム鍵を隠せるようにする。時間分離モデルでプラットフォーム鍵セキュリティを提供する形の1つが、リセットラッチと称するステートフルガード回路を使用することである。リセットラッチは、リセットまたは電源投入の後に開かれるが、いつでもどのソフトウェアでもこのラッチをプログラム的に閉じることができるというプロパティを有するハードウェア回路である。閉じられたならば、ラッチは、次のリセットまたは電源投入まで閉じられたままになる。時間分離されるセキュリティカーネルを実施するプラットフォームは、リセットラッチの状態に基づいてプラットフォーム鍵アクセスをゲーティングしなければならず、セキュリティカーネルは、上位層に制御を渡す前にこのラッチを閉じなければならない。上で説明したように、セキュリティカーネルは、制御を渡す前に、メモリおよびレジスタのクリアなどの追加処理も講じなければならないが、これらの処理は、上位層で使用される物と同一である。
【0119】
プラットフォームで、空間分離が使用される場合には、セキュリティカーネルで、特権モードを使用して、それ自体およびそのプラットフォーム鍵を、セキュリティカーネルがホストするプログラム(たとえばオペレーティングシステム)から保護する。さらに、セキュリティカーネルは、認証動作の呼出しに関するシステム呼出しインターフェースを確立する。
【0120】
プラットフォームで、空間分離が使用される場合には、そのプラットフォームに、サービスルーチンにパラメータを渡すためにセキュリティリセットの後まで残されるストレージも含まれなければならない。サービスを呼び出すために、オペレーティングシステムは、セキュリティカーネルに既知のメモリ位置にコマンドおよびパラメータブロックを準備し、セキュリティリセットを実行する。OSが、サービス呼出しの後に実行を継続する(単純な再始動ではなく)ことを望む場合には、OSおよびセキュリティカーネルが、これを信頼性があり安全な形で行えることを保証するために余分な処理を講じなければならない。
【0121】
本明細書で説明する認証された動作は、ウィルスからの個人データの保護、ネットワーク攻撃からの機密サーバデータの保護、ネットワーク管理、コピープロテクト、信頼性のある分散コンピューティングなど、さまざまな設定でセキュリティに使用することができる。認証される動作を用いると、特定の信頼関係でなしに同一のコンピュータで実行できる異なるプログラムが、他のソフトウェアの処理に無関係にその暗号リソースを保存できるようになる。
【0122】
下の説明の一部で、SSP(Secure Service Processor、セキュアサービスプロセッサ)に言及する。一実施形態では、SSPが、コンピューティングデバイスに基本的な暗号サービスを提供するプロセッサ(コンピューティングデバイス内で使用するための)である(たとえば、SSPが、本明細書で説明するゲーティング機能(たとえば図2の層l1)をサポートする)。SSPは、暗号鍵を利用することができ、通常は、そのSSPに一意の(または一意であると期待される)1つまたは複数の暗号鍵を有する。SSPは、デバイスのCPUの一部とするか、その代わりに1つまたは複数の他のプロセッサとすることができる。たとえば、SSPを、コンピューティングデバイス内の別のチップまたは集積回路(IC)とすることができる。
【0123】
異なる実施形態では、SSPが、前の実施形態と同一の機能性を呼出し側に公開する、適当に分離されたソフトウェアプログラムである。このSSP実施形態は、暗号鍵へのアクセス(直接にまたは間接的に)を有する。そのようなアクセスの提供に関して、複数の実施形態のオプションが存在する。たとえば、SSPから、下位層のサービスガードまたは開示ガードを呼び出すことができる。あるいは、SSPが、永続メモリ(たとえば、ハードディスク、フラッシュメモリ、ROMなど)のうちで必要な暗号鍵を含む部分への排他的なアクセスを有することができる。
【0124】
要約すると、SSPは、それが上位のプリンシパルに公開する機能性によって定義される。SSPは、暗号鍵へのアクセス(直接のまたは間接的な)を有するガード(上で説明した)である。SSPでは、これらの鍵を使用して、呼出し側に暗号サービスを提供する。以下の節では、SSPが公開する例示的な機能性を説明する。
【0125】
例示的な動作
下記は、シールドストレージ動作の例示的実施形態およびリモート認証動作の説明である。この節では、上で説明したSeal動作、UnSeal動作、Quote動作、およびPKUnseal動作の例の実施形態を説明する。
【0126】
この節では、下記の定義を使用する。
【0127】
【表1】
【0128】
さらに、この節および下の束縛鍵動作の節で、アクセスポリシに言及する。アクセスポリシによって、特定の動作が機能する(すなわち、それが動作する)場合が記述される。コンピューティングデバイスのユーザは、ある機能を選択的にオフに切り替えることがで
【0129】
きる。たとえば、コンピューティングデバイス(たとえばSeal動作を実施するSSP)に、FeatureEnableと称するレジスタが含まれる。このレジスタのビットの1つを、MainEnableと称する。ユーザが、MainEnableに偽をセットする場合に、この節の機能のどれもが、動作しなくなる。各関数に含まれるアクセスポリシの説明によって、どのFeatureEnable設定の下でその関数が動作するかが記述される。
【0130】
Seal
定義
SSP_STATUS Seal (
[in] SECRET S,
[in] DIGEST Target[2],
[in] UINT32 MaxLen,
[out] UINT32* ActualLen,
[out] BYTE* SealedBlob
【0131】
パラメータ
Seal-Input ::= SEQUENCE {
ordinal INTEGER,
secret Secret,
target DigestPair }
Seal-Output ::= SEQUENCE {
ordinal INTEGER,
status INTEGER,
sealed-blob OCTET STRING }
【0132】
戻り値
SSP_SUCCESS
【0133】
コメント
Seal動作は、下記の評価が真の場合に、対応するUnseal動作によってのみ暗号解読できる暗号化されたblob(ビットのグループ)を形成する。
・符号化が正しいか
・MACが正しいか
・現在動作しているSK/SL(セキュリティカーネルまたはセキュアローダー)が、Seal動作中にターゲットとして名前を指定された物であるか
【0134】
Sealでは、内部のランダムさを追加し、その結果、同一の入力に対するSeal動作の出力が、異なる結果を生じるようにする。これによって、Sealをハードウェアデバイス識別子として使用できないことが保証される。Sealには、開封する物に保全性情報を提供するように封印が実行された場合に、Seal動作を呼び出したプログラムの識別子(たとえば、本明細書でPCR値とも称する、SSPのPCRレジスタに保存された、呼出し側プログラムのダイジェスト)も含まれる。
【0135】
アクセスポリシ
Allowed = FeatureEnable.MainEnable & (FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【0136】
処理 Seal動作では、下記の処理が実施される。
1.128ビットの乱数Rを生成する
2.D0が、PCR[0]の現在の値になるようにし、D1=PCR[1]にする
3.ダイジェストM=HMAC[KM](R‖S‖target‖D0‖D1)
4.C=AES[KS](R‖S‖Target‖D0‖D1‖M)
5.SealedBlobにCをセットしてSSP_SUCCESSを返す
【0137】
Unseal
定義
SSP_STATUS Unseal (
[in] BYTE* SealedBlob,
[in] UINT32 SealedBlobLen,
[out] SECRET S,
[out] DIGEST Source
)
【0138】
パラメータ
Unseal-Input ::= SEQUENCE {
ordinal INTEGER,
sealed-blob OCTET STRING }
Unseal-Output ::= SEQUENCE {
ordinal INTEGER,
status INTEGER,
secret Secret,
source Digest }
【0139】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
【0140】
コメント Unseal動作では、Seal動作によって生成されたblobを内部で暗号解読し、下記の条件を検査する。 ・符号化が正しいか ・PCRの現在の値が、Seal動作中にターゲットとして名前を指定された物であるか
【0141】
すべての検査に成功する場合に、secretおよび封印した物のPCRを返し、そうでない場合にはUNSEAL_ERRORを返す。
【0142】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UseSymmKey==All |
FeatureEnable.UseSymmKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UseSymmKey)
【0143】
処理
Unseal動作では、下記の処理を実施する。
1.M=AES−1[KS](SealedBlob)。
2.Mを(BITS[128] R‖SECRET S1‖DIGEST Target0‖DIGEST Target1‖DIGEST Sealer0‖DIGEST Sealer1‖DIGEST N)として解釈する。
3.ダイジェストD=HMAC[KM](R‖S1‖Target0‖Target1‖Sealer0‖Sealer1)。
4.(Target0!=PCR[0]‖Target1!=PCR[1])の場合に、S、Sourceに0をセットしてSSP_UNSEAL_ERRORを返す。
5.D!=Nの場合に、S、Sourceに0をセットしてSSP_UNSEAL_ERRORを返す。
6.そうでない場合に、SにS1、Sourceに{Sealer0、Sealer1}をセットしてSSP_SUCCESSを返す。
【0144】
Quote
定義
SSP_STATUS Quote (
[in] BITSTRING d-ext,
[out] PKSignature SigBlob
)
【0145】
パラメータ
Quote-Input ::= {
ordinal INTEGER,
d-ext Digest }
Quote-output ::= {
ordinal INTEGER,
status INTEGER,
sig-blob PKSignature }
【0146】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
【0147】
コメント
Quote動作では、SSPに、外部から供給されるD−EXTおよび内部のPCR値の連結に署名するように指示する。
【0148】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0149】
処理 Quote動作では、下記の処理を実施する。 1.SSPは、DER(Distinguished Encoding Rules)符号化の下で、メッセージ型QuoteMessageの識別子D−EXTおよびPCRレジスタの内容の連結からなるメッセージMを形成する。
SEQUENCE {
message-typePK
MessageType,
d-ext Digest,
pcr DigestPair
}
【0150】
2.SSPが、KQ、PRIVを使用して、PKCS #1 V2.1で指定されるRSASSA−PSS−SIGNのデフォルト実装に従って、Mに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0151】
3.SSPが、SSP_SUCCESSおよび計算されたばかりの署名値を、SigBlobのsignatureAlgorithm=rSASSA−PSS−Default−Identifierと共に返す。
【0152】
PKUnseal
定義
SSP_STATUS PK_Unseal (
[in] PKCiphertext SealedBlob,
[out] SECRET Secret
)
【0153】
パラメータ
PkUnseal-Input ::= {
ordinal INTEGER,
pk-sealed-blob PKCiphertext }
PkUnseal-output ::= {
ordinal INTEGER,
status INTEGER,
secret Secret }
【0154】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0155】
コメント PKUnseal動作は、長さ416ビットで特定のフォーマットの暗号化されたblobをとる。blobを暗号解読し、暗号解読および復号が成功の場合には、416ビットメッセージを、秘密値および暗号解読された値を受け取ることを許可されるPCR値の連結として解釈する。
【0156】
現在のPCR値が、暗号化されたblobで指定される物と等しい場合に、秘密を明かし、そうでない場合には、エラーを返す。
【0157】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0158】
処理
PKUnseal動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0159】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0160】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。
【0161】
4.そうでない場合には、回復されたメッセージMが、DER符号化の下で下記の形でなければならない。
SEQUENCE {
message-type PKMessageType,
secret Secret,
target Digest }
【0162】
さらに、Secretは、256ビット(=32オクテット)からならなければならず、targetは、160ビット(=20オクテット)からならなければならない。メッセージ型は、sspV1PKSealedMessageでなければならない。これらの条件のいずれかが満たされない場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。そうでない場合には
1.target!=PCRの場合には、Secretに0をセットしてSSP_BAD_DATA_ERRORを返す。
2.target==PCRの場合には、SecretにsecretをセットしてSSP_SUCCESSを返す。
【0163】
束縛鍵動作 さらに、束縛鍵関数または束縛鍵動作の組を用いると、ローカルに暗号鍵を作成でき、証明できるようになり(たとえばSSPによって)、また、信頼されるリモート当事者から暗号鍵を通信できるようになる(たとえば、SSPに通信する)。
【0164】
束縛鍵機能性は、下記の特徴がある。 1.あるシステム層のサービスガード(たとえばSSP)が、束縛鍵に直接にアクセスする。各束縛鍵は、どのガードがその束縛鍵にアクセスできるかを判定する関連する条件を有する。条件は、暗黙のうちに表される。すなわち、束縛鍵は、ガードの1つまたはある組だけが束縛鍵を暗号解読する鍵を有するように暗号化される。
【0165】
2.束縛鍵へのアクセスを有するサービスガードは、上位層のプリンシパルに束縛鍵の使用を必要とする機能(たとえば、署名、MAC、暗号化、暗号解読)を公開する。各束縛鍵は、関連する使用条件を有することができ、その場合に、ガードは、関連する条件を満足する要求だけをサービスする。
【0166】
3.束縛鍵は、暗号的に保護されたデータ構造体(本明細書では束縛鍵blobとも称する)に含まれる。束縛鍵blobは、自己保護的であり、信頼される環境の外に保存することができる。
【0167】
束縛鍵は、下記の長所を有する。
・各プリンシパルがそれ自体の束縛鍵を有することを許可することができる。さらに、各プリンシパルが、任意の数の束縛鍵を有することを許可することができる。これによって、より細かい粒度のポリシ設定が可能になり、ある種のアプリケーションでのプライバシが改善される。したがって、ガードが、すべてのプリンシパルからの要求をサービスするのに使用される唯一のまたは少数の鍵だけを有するように制限する必要がない。
【0168】
・束縛鍵は、許可されるサービスガードの外に開示されない。したがって、プリンシパルを危うくすること(たとえば、プログラミングエラーに起因する)が、すべての束縛鍵を危うくすることにつながらない。一実施形態では、サービスガード(SSP)が、ハードウェアで実施される。この場合に、悪意のあるソフトウェアまたは不正なソフトウェアに起因して束縛鍵を危うくすることはできない。
【0169】
束縛鍵機能によって、暗号鍵の保護が提供される。束縛鍵を、リモート当事者が生成することができ、あるいは、GenBoundKeyコマンドを介してローカルに作成することができる。
【0170】
ローカルに作成される束縛鍵は、公開鍵のタイプ、生成される鍵のタイプ、生成中の機械の状態、および鍵がそれに束縛される(任意選択の)条件(たとえダイジェスト)の証拠をリモート当事者に与えるのに使用することができる「引用」証明書を発することができる。
【0171】
束縛鍵には、下記の要素の1つまたは複数が含まれる。
・鍵の使用法(たとえば、BoundSign、BoundQuote、BoundPkUnseal、BoundPkDecrypt、BoundMAC、BoundEncrypt、またはBoundDecrypt)。この要素は、任意選択である。含まれる場合には、この要素によって、束縛鍵が、識別される関数型での使用だけに制限される。
【0172】
・どの条件の下でこの束縛鍵を使用できるかを指定する条件要素(上で説明した物)(束縛鍵使用条件とも称する)。たとえば、条件を、プログラムの1つまたは複数のダイジェストの形で表すことができる。この場合に、束縛鍵は、ダイジェストが指定されるプログラムによって、またはそのプログラムの代わりにのみ使用されなければならない。条件の他の要素には、上で説明したように、時間制約、論理式、および実行可能プログラムが含まれる。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、デフォルト条件では、束縛鍵へのアクセスを制限しないことができる(空の条件)。
【0173】
・鍵を計算できるようにする、暗号鍵(束縛鍵)または他のデータ。
【0174】
・その下で束縛鍵使用条件を変更できる1つまたは複数の条件(上で説明した物)。そのような変更を、束縛鍵移植とも称し、そのような条件を、移植条件と称する。この要素は、任意選択である。この要素が省略された場合には、あるデフォルト条件が適用される。たとえば、ダイジェスト(存在する場合に)を変更できないように、デフォルト条件を「常に偽」とすることができる。
【0175】
・その下で、束縛鍵に直接にアクセスできるサービスガードの組を変更できる1つまたは複数の条件。そのような変更を、束縛鍵エクスポートとも称し、そのような条件を、エクスポート条件と称する。この要素は任意選択である。
【0176】
束縛鍵の暗号的保護 束縛鍵は、上で説明したシールドストレージおよび立証関数(Seal、Unseal、PKUnseal)と同一の暗号要件を有する。具体的に言うと、ローカルに生成される束縛鍵は、上で説明したStore関数およびRetrieve関数の暗号実施形態のいずれかによって保護することができる。どの場合でも、束縛鍵の使用法を支配する異なる条件が破壊されていないことを保証するために、束縛鍵自体の信頼性が、保護され、全体的なデータ構造体の保全性が、保護される。前に説明したように、これは、対称暗号または公開鍵暗号化およびMACまたはディジタル証明のさまざまな組合せによって達成することができる。一実施形態では、束縛鍵データ構造体が、公開鍵によって暗号化される。
【0177】
関数
ある実施形態で、束縛鍵を、下記の関数の1つまたは複数で使用することができる。
・BoundSign
・BoundQuote
・BoundPkDecrypt
・BoundPkUnseal
・BoundMAC
・BoundEncrypt
・BoundDecrypt
・GenBoundKey
・BoundKeyMigrate
・BoundKeyExport
【0178】
これらの関数のそれぞれで、束縛鍵blob(データ構造体内のビットのグループ)および束縛鍵blobに含まれる鍵によって操作されるデータが、束縛鍵関数へのパラメータとして供給される。鍵使用法要素が束縛鍵blobに含まれる場合に、SSPによって、束縛鍵が正しい目的に使用されることが保証される(たとえば、型「BoundQuoteKey」を使用して作成された鍵は、BoundQuote動作でのみ使用することができる)。
【0179】
いくつかの実施形態で、束縛鍵が、公開/秘密鍵対の秘密鍵である。そのような実施形態では、束縛鍵blobに、秘密鍵を含めることができ、その代わりに、鍵を計算できるようにする何らかのデータを含めることができる。たとえば、秘密鍵の断片を、束縛鍵blobに含めることができ、この断片を、対応する公開鍵と共に使用して、公開/秘密鍵対の秘密鍵を再構成することができる。
【0180】
BoundSign動作では、束縛鍵を使用して署名されるデータ入力を受け取り、束縛鍵blobも受け取る。SSPが、束縛鍵blobから秘密署名鍵を回復し、回復された署名鍵を使用して、データ入力に対するディジタル署名されたメッセージを生成する。その後、SSPが、ディジタル署名されたメッセージを出力する。束縛鍵blobが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。したがって、秘密鍵をSSPが明かさずに、回復された秘密鍵を使用してデータ入力にディジタル署名することができる。
【0181】
BoundQuote動作では、署名されるデータおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、その後、回復された署名鍵を使用して、上で説明したQuote動作と同様に、この動作に入力されたデータおよび現在のPCR値(たとえば、BoundQuote動作を呼び出したプログラムの、ダイジェストなどの識別子)に対する署名を生成する。その後、SSPが、ディジタル署名されたメッセージを出力する。束縛鍵blobが、破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。一実施形態では、BoundQuote動作が、BoundSign動作に類似するが、BoundQuote動作で現在のPCR値が使用される点が異なる。
【0182】
BoundPkDecrypt動作では、暗号テキストおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、回復された秘密束縛鍵を使用して、入力暗号テキストを暗号解読する。その後、暗号解読されたデータが、BoundPkDecrypt動作によって出力される。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。
【0183】
BoundPkUnseal動作では、暗号テキストおよび束縛鍵blobを入力として受け取る。SSPが、束縛鍵blobから秘密鍵を回復し、その秘密鍵を使用して、上で説明したPKUnseal動作と同様に、入力暗号テキストを暗号解読する。暗号解読されたデータが、BoundPkUnseal動作によって出力される。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。
【0184】
BoundMAC動作では、それに対して束縛鍵を使用してMACが計算されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力に対するメッセージ確認コード(MAC)を生成する。SSPが、計算されたMACを出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力のMACを計算することができる。
【0185】
BoundEncrypt動作では、束縛鍵を使用して暗号化されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号化する。SSPが、計算された暗号テキストを出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号化することができる。
【0186】
BoundDecrypt動作では、束縛鍵を使用して暗号解読されるデータ入力を受け取り、束縛鍵blobも受け取る。束縛鍵blobが破壊されているか、束縛鍵使用条件があり、その条件が満足されない場合に、SSPは、動作を実行しない。そうでない場合には、SSPが、束縛鍵blobから束縛鍵を回復し、回復された束縛鍵を使用して、データ入力を暗号解読する。SSPが、計算された平文を出力する。したがって、SSPが束縛鍵を明かさずに、回復された束縛鍵を使用してデータ入力を暗号解読することができる。
【0187】
GenBoundKey動作では、SSPに、新しい束縛鍵を作成させる。新しい束縛鍵は、暗号鍵であり、新たに生成された鍵を含む新しい束縛鍵blobが生成される。束縛鍵blobに、必ず鍵全体が含まれるわけではないことを諒解されたい。たとえば、新たに生成される鍵が、公開/秘密鍵対である場合に、束縛鍵blobに秘密鍵だけを含めれば十分である場合がある。
【0188】
新しい束縛鍵blobは、1つまたは複数のガードに束縛され、このガードは、通常は、動作を実行しているSSPである(たとえば、上で説明したStore関数に似た形で新しい束縛鍵blobを暗号的に保護することによって、または、他の形で新しい束縛鍵blobを保護し、その結果、そのSSPだけがそれを検索できるようにすることによって)。GenBoundKey動作は、新しい束縛鍵blobのさまざまな態様を決定するパラメータを有することもでき、これらのパラメータを記述したデータが、ある保全性を保護される形で、新たに生成される秘密鍵に付加される(たとえば、データが、新しい束縛鍵blobの一部にされる)。このデータの例には、上で説明したように、移植条件、束縛鍵使用条件などが含まれる。その後、新しい束縛鍵blobが、GenBoundKeyによって出力される。
【0189】
一般に、束縛鍵は、対称鍵または公開鍵秘密鍵対を含む、任意の種類の暗号鍵とすることができる。正確な鍵のタイプは、それが使用される束縛鍵動作に依存する。たとえば、BoundMACに使用される束縛鍵は、通常は対称鍵であるが、BoundSignに使用される束縛鍵は、通常は公開/秘密署名鍵対である。鍵のタイプは、GenBoundKeyへのパラメータとして指定することができる。
【0190】
BoundKeyMigrateを用いると、束縛鍵の使用条件を変更できるようになる。SSPが、1つまたは複数の移植条件が満足されることを検証する。さまざまな条件のどれでも、BoundKeyMigrate動作と共に使用することができる(たとえば、Seal動作およびUnSeal動作に関して上で説明した条件に類似する、データを移植できる場合および/または相手を識別するすべての条件)。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、ガードが新しい束縛鍵blobを作り、その束縛鍵blob内で、束縛鍵使用条件が、要求された通りに変更されている。
【0191】
BoundKeyExport動作では、SSPに、束縛鍵に直接にアクセスできるガード(SSP)の組を変更するように指示する。SSPは、1つまたは複数の条件が満足されることを検証する。さまざまな条件のどれでも、BoundKeyExport動作と共に使用することができる(たとえば、Seal動作およびUnSeal動作に関して上で説明した条件に類似する、データをエクスポートできる場合および/または相手を識別するすべての条件)。検証が成功裡に行われない場合には、動作が失敗する。検証が成功裡に行われる場合には、SSPが、要求された通りに、束縛鍵blobに対する暗号保護を変更する。一実施形態では、SSPが、1つまたは複数の新しい鍵を用いて束縛鍵データ構造体を暗号化する。
【0192】
束縛鍵の作成者(ローカルであれリモートであれ)が指定できる条件のクラスの例が、束縛鍵を、特定の値を有するプログラムダイジェストを有するプリンシパルの代わりにのみ使用できることである。この場合に、束縛鍵動作によって、束縛鍵blobの内部検索の後に、要求元プリンシパルのダイジェストが検査され、そのダイジェストが束縛鍵blobで指定された物でない場合には、追加の計算を実行せずに、束縛鍵動作が失敗する。
【0193】
束縛鍵blobは、通常は、成功するために特定のSSPの一意の鍵を必要とする暗号動作によって、特定のSSPに結び付けられる、すなわち束縛される。そのような動作の例が、MAC関数、ディジタル署名関数、暗号化関数、および暗号化関数および保全性検証関数の組合せである。
【0194】
束縛鍵動作の例
一実施形態では、移植が、ローカル移植証明書または許可する実体によって発行されたエクスポート証明書によって許可される。ローカル移植証明書は、下記のデータ構造体に対するRSASSA−PSS−SIGN動作のデフォルトである。
Bound-migration-info ::= SEQUENCE {
source-bound-blob-digest Digest,
dest-PCR DigestPair
}
【0195】
ローカルSSP移植は、BoundKeyMigrate動作を使用して要求される。ローカル移植を許可するために、SSPに、この束縛鍵を参照するBound−migration−info構造体、および許可された実体によって供給されるこの構造体に対する正しく形成された証明書が供給される。移植許可が受入可能である場合には、SSPが、他の鍵属性のすべてを未変更のままにして、新しいPCRについて鍵を再束縛する(たとえば、鍵が元々PCR値に束縛されていない場合には、再束縛の場合にも束縛されない)。source−bound−blob−digestは、束縛鍵の暗号化された外部形のダイジェストである。
【0196】
リモート移植は、たとえば許可する実体によって署名された下記のBound−export−info構造体を用いて、BoundKcyExport関数を介して達成される。
Bound export-info ::= SEQUENCE {
source-bound-blob-digest Digest,
dest-pubkey RSAPublicKey
dest-PCR DigestPair
}
【0197】
許可する実体は、鍵がエクスポート可能とマークされる場合に、鍵が再束縛されるデバイスまたはソフトウェアモジュールを完全に制御する。
【0198】
束縛鍵動作では、PKCiphertextが使用され、このPKCiphertextは、プラットフォーム公開暗号化鍵を用いて暗号化された、下記の型Bound−key−blobのシーケンスである。
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 }
【0199】
bound−to−PCR要素は、束縛鍵を使用するために、bound−toダイジェストフィールドが、現在のPCR値と一致しなければならないかどうかを示すフラグである。{migrateable、migrate−auth}は、鍵が移植可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す(migrateableが偽の場合に、migrate−auth値は重要でない)。{exportable、export−auth}は、鍵がエクスポート可能であるかどうかを示し、そうである場合に、どの権限の制御下であるかを示す(exportableが偽の場合に、export−auth値は重要でない)。pub−key−digestは、PKCompressedPrivateKeyおよび秘密鍵の回復に必要な公開鍵の間の強い束縛を提供するための、対応する公開鍵のダイジェストである。
【0200】
一実施形態では、GenBoundKey関数を用いて束縛鍵がローカルに作成される場合に、SSPが、生成されたばかりの鍵のパブリックプロパティの詳細を示すデータ構造体、および束縛鍵エクスポート中のシステムの構成に対する署名を作成する。
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 }
【0201】
このデータ構造体内で、key−type、bound−to−PCR、bound−to、migrateable、migrate−auth、exportable、およびexport−authが、新たに生成された鍵の束縛鍵特性である。creator−PCRは、鍵がエクスポートされた時にアクティブであったPCRであり、bound−pub−keyは、新たに作成された公開鍵のダイジェストである。sig−nonceは、束縛鍵生成が要求された時に渡されたダイジェストサイズの値である。
【0202】
BoundSign、BoundQuote、BoundPkDecrypt、BoundPkUnseal、GenBoundKey、BoundKeyMigrate、およびBoundKeyExport動作の例示的定義を下に示す。
【0203】
BoundSign
定義
SSP_STATUS BoundSign (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BITSTRING DataToBeSigned
[out] PKSignature sig-blob
)
【0204】
パラメータ
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 }
【0205】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【0206】
コメント BoundSign動作では、型BoundSignKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextおよび対応する公開鍵をとる。この条件のどちらかが満足されない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0207】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0208】
最後に、SSPが、暗号解読された秘密鍵を用いて入力メッセージに署名する。
【0209】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &(FeatureEnable.UsePrivKey==All |FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0210】
処理
BoundSign動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0211】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0212】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0213】
4.そうでない場合には、回復されたメッセージMが、型BoundSignKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0214】
5.bound−to−PCRがTRUEの場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0215】
6.SSPが、供給された関連する公開鍵を使用して束縛された秘密鍵を回復する。これに失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。成功の場合には、SSPが、回復された秘密鍵束縛鍵を使用して、PKCS #1 V2.1で指定されたRSASSA−PSS−SIGNのデフォルト実装に従って、入力メッセージDataToBeSignedに対する署名されたメッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0216】
7.SSP_SUCCESSを返す。
【0217】
BoundQuote
定義SSP_STATUS BoundQuote (
[in] PKCiphertext BoundKeyBlob,
[in] DIGEST DataToBeSigned
[out] PKSignature sig-blob)
【0218】
パラメータ
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 }
【0219】
戻り値
SSP_SUCCESS
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
SSP_UNSEAL_ERROR
【0220】
コメント BoundQuote動作では、型BoundQuoteKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0221】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0222】
最後に、SSPが、暗号解読された秘密鍵を用いて入力メッセージを引用する。
【0223】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0224】
処理
BoundQuote動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0225】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0226】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0227】
4.そうでない場合には、回復されたメッセージMが、型BoundQuoteKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0228】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0229】
6.その後、SSPが、回復された秘密鍵断片および公開鍵を使用して、秘密鍵を再構成する。秘密鍵は、下記のように再構成することができる。一般に、RSA鍵は、数N=p×q(Nは、2つの素数pおよびqの積である)および2つの指数e(暗号化指数)およびd(暗号解読指数)からなる。Nおよびeが公開鍵を形成し、dが秘密鍵である。一般に、dは、Nと同じ長さである(たとえば2048ビット)。Nの因数分解が既知である場合(すなわち、pおよびqが既知の場合)に、秘密鍵dを、簡単に判定することができる。pおよびqが、Nの半分の長さにすぎないことに留意されたい。したがって、秘密鍵としてdを保存するのではなく、本発明ではpを保存する。したがって、公開鍵N、e、およびpを与えられれば、値q=N/pを計算でき、その後、pおよびqから値dを決定することができる。
【0230】
その後、この秘密鍵を使用して、上で定義されたQuote動作の指定に従って、入力メッセージDataToBeSignedおよび現在のPCR値に対する署名メッセージを生成する。この関数がエラーを返す場合には、SigBlobに0をセットしてSSP_CRYPTO_ERRORを返す。
【0231】
7.SSP_SUCCESSを返す。
【0232】
BoundPkDecrypt
定義
SSP_STATUS BoundPkDecrypt (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeDecrypted,
[out] Secret decryptedData
)
【0233】
パラメータ
BoundPkDecrypt-Input ::= {
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext }
BoundPkDecrypt-output ::= {
ordinal INTEGER,
status INTEGER,
d-blob Secret }
【0234】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0235】
コメント
BoundPkDecrypt動作では、型BoundDecryptKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0236】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0237】
最後に、SSPが、束縛blobから暗号解読された秘密鍵を用いて入力メッセージを暗号解読する。
【0238】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0239】
処理
BoundPkDecrypt動作では、下記の処理を実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0240】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0241】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0242】
4.そうでない場合には、回復されたメッセージMが、型BoundDecryptKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0243】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならず、これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0244】
6.SSPが、供給された公開鍵を使用して秘密鍵を回復する。秘密鍵は、上でBoundQuote動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用して、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装を使用してpk−sealed−blobを暗号解読し、平文メッセージMを入手する。
【0245】
7.SSPが、d−blobにMをセットする。
【0246】
8.SSP_SUCCESSを返す。
【0247】
BoundPkUnseal
定義SSP_STATUS BoundPKUnseal (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey BoundPubKey,
[in] PKCiphertext DataToBeUnsealed
[out] Secret decryptedData
)
【0248】
パラメータ
BoundPKUnseal-Input ::= {
ordinal INTEGER,
bound-key BoundKeyBlob,
bound-pub-key RSAPublicKey,
pk-sealed-blob PKCiphertext }
BoundPKUnseal-output ::= {
ordinal INTEGER,
status INTEGER,
d-blob Secret }
【0249】
戻り値
SSP_SUCCESS
SSP_UNSEAL_ERROR
SSP_CRYPTO_ERROR
SSP_BAD_DATA_ERROR
【0250】
コメント
BoundPkUnseal動作では、型BoundPKUnsealKeyのBoundKeyBlobを含む型sspV1BoundKeyのPKciphertextをとる。これらの条件のどちらかが満たされない場合、またはシーケンスを復号できない場合に、動作が失敗し、SSP_CRYPTO_ERRORが返される。
【0251】
bound−to−PCRがセットされる場合には、SSPが、現在のPCR値がBound−key−blobシーケンスで指定されていることを検査する。そうでない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0252】
最後に、SSPが、束縛blobから暗号解読された秘密鍵と共にPK_Unsealを使用して、入力メッセージを封印解除する。
【0253】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0254】
処理
BoundPkUnseal動作では、下記のステップを実施する。
1.SSPが、pk−sealed−blobのAlgorithmIdentifierがsspV1BoundKeyであるかどうかをテストする。
【0255】
2.SSPが、PKCS #1 V2.1で指定されるRSAES−OAEP−DECRYPTのデフォルト実装に従ってSealedBlobを内部で暗号解読し、平文メッセージMを入手する。
【0256】
3.復号動作の出力が、「復号エラー」である場合には、Secretに0をセットしてSSP_CRYPTO_ERRORを返す。
【0257】
4.そうでない場合には、回復されたメッセージMが、型BoundDecryptKeyのBound−key−blob形式のDER符号化でなければならない。そうでない場合には、SSPがSSP_CRYPTO_ERRORを発しなければならない。
【0258】
5.bound−to−PCRが真の場合には、bound−toを現在のPCR値と比較しなければならない。これらの値が同一でない場合には、SSPが、SSP_CRYPTO_ERRORを出力しなければならない。
【0259】
6.SSPが、束縛鍵blobを使用して秘密鍵を再作成する。秘密鍵は、上でBoundQuote動作に関して説明したように回復することができる。その後、回復された秘密束縛鍵を使用し、PK_Unsealコマンドで説明したステップを使用して、pk−sealed−blobを封印解除する。
【0260】
7.封印解除されたblobで名前を指定されるPCRが、現在のPCRと一致しない場合には、SSPが、SSP_CRYPTO_ERRORを返す。
【0261】
8.そうでない場合には、SSPが、d−blobにMをセットする。
【0262】
9.SSP_SUCCESSを返す。
【0263】
GenBoundKey
定義
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
)
【0264】
パラメータ
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 }
【0265】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0266】
コメント
GenBoundKey動作では、SSPに、新たに生成された秘密鍵を含む新しいbound−key blobを生成させる。bound−key blobは、SSP自体の公開鍵を用いて暗号化される。
【0267】
GenBoundKeyでは、新たに生成された鍵対の公開鍵、SSPがその鍵を生成したことを示す引用署名、その特性、および鍵が生成された時のPCR値も出力される。
【0268】
GenBoundKeyを呼び出す側は、作成される束縛鍵のタイプすなわち、それが署名、引用、BoundPkUnsealを用いる封印解除、またはBoundPkDecryptを用いる暗号解読のどれに使用されるかも示す。呼出し側は、束縛鍵をPCRに束縛しなければならないかどうかと、そうである場合に、それが束縛されるPCR値も指定する。
【0269】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey )
【0270】
処理
GenBoundKey動作では、下記の処理を実施する。
1.SSPが、新しい公開秘密RSA鍵対を生成する。SSPは、任意選択として、そうでなければSSPがアイドルである場合に鍵対を生成し、即時検索用に不揮発性メモリ内の鍵の小さいキャッシュに保存することができる。
【0271】
2.SSPが、新たに生成された秘密鍵、および呼出し側によって供給された束縛鍵のタイプおよび他のパラメータを含む束縛鍵構造体を内部で生成する。
【0272】
3.SSPが、プラットフォーム公開暗号化鍵を用いて束縛鍵blobを暗号化する。
【0273】
4.SSPが、新たに作成された鍵のプロパティ、鍵作成時のPCR値、および供給されたナンスを含むBound−key−pub−infoの署名されたblobを生成する。
【0274】
5.SSPが、暗号化された束縛鍵blob、新たに生成された公開鍵、および引用された鍵blobを出力する。
【0275】
6.SSP_SUCCESSを返す。
【0276】
BoundKeyMigrate
定義
SSP_STATUS BoundKeyMigrate (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_MIGRATION_INFO MigrationInfo,
[in] RSA_SIG SigOnMigrationInfo
)
【0277】
パラメータ
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,
}
【0278】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0279】
コメント
BoundKeyMigrate動作では、SSPに、制御された形で鍵を異なるPCR値に再束縛するように指示する。ローカルまたはリモートの元の鍵作成者が、移植許可実体の名前を指定する。移植可能とマークされた束縛鍵だけを移植することができ、これらの束縛鍵は、適当に署名されたBound−migration−info構造体がSSPに供給される場合に限って移植される。適当に署名されたとは、束縛鍵blobにそのダイジェストが含まれる公開鍵を用いる署名を意味する。他の束縛鍵属性は変更されない。
【0280】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0281】
処理
BoundKeyMigrate動作では、下記の処理を実施する。
1.SSPが、bound−key構造体を内部で暗号解読し、Bound−key−blobとして解釈する。復号に失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。
【0282】
2.SSPが、Bound−export−infoが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Bound−key−blobの「migrateable」フィールドで名前を指定されていることを検証する。
【0283】
3.SSPが、鍵が移植可能であることを検査する。そうでない場合には、SSPがSSP_CRYPO_ERRORを返す。
【0284】
4.鍵がPCRに束縛される場合に、SSPが、現在のPCRが鍵blobで名前を指定されていることを検査する。
【0285】
5.SSPが、PCR値を、Bound−migration−infoのdest−PCRフィールドで名前を指定された物に置換する。
【0286】
6.SSPが、束縛鍵blobを再暗号化し、再暗号化された構造体をエクスポートする。
【0287】
7.SSP_SUCCESSを返す。
【0288】
BoundKeyExport
定義
SSP_STATUS BoundKeyExport (
[in] PKCiphertext BoundKeyBlob,
[in] RSAPublicKey PubPartOfBoundKey,
[in] BOUND_EXPORT_INFO ExportInfo,
[in] RSA_SIG SigOnExportInfoInfo,
[out] PKCipherText ReBoundBlob
)
【0289】
パラメータ
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,
}
【0290】
戻り値
SSP_SUCCESS
SSP_BAD_DATA_ERROR
【0291】
コメント
BoundKeyExport動作では、SSPに、束縛鍵の秘密部分を、制御された形で、ソースデバイスの束縛鍵との一貫性がある形でリモート実体にエクスポートするように指示する。ローカルまたはリモートの元の鍵作成者が、エクスポート許可実体の名前を指定する。エクスポート可能とマークされた束縛鍵だけをエクスポートすることができ、これらの束縛鍵は、適当に署名されたBound−export−info構造体がSSPに供給される場合に限ってエクスポートされる。適当に署名されたとは、元の束縛鍵blobにそのダイジェストが含まれる公開鍵を用いる署名を意味する。BoundKeyExportを用いると、適当に許可された呼出し側が、鍵をそれに再束縛しなければならないターゲット実体の公開鍵およびPCR値を指定できるようになる。外部実体がSSPであるという特別な要件はないが、新たに束縛されるblobは、リモートSSPがエクスポートされた束縛鍵を直接に消費できるようにするために、束縛鍵の慣習に従う。
【0292】
アクセスポリシ
Allowed = FeatureEnable.MainEnable &
(FeatureEnable.UsePrivKey==All |
FeatureEnable.UsePrivKey==AuthSL
& SLKnown & AuthPCR[CurrentSL].UsePrivKey)
【0293】
処理
BoundKeyExport動作では、下記の処理を実施する。
1.SSPが、bound−key構造体を内部で暗号解読し、Bound−key−blobとして解釈する。復号に失敗する場合には、SSPがSSP_CRYPTO_ERRORを返す。
【0294】
2.SSPが、Bound−export−infoが同一の鍵を参照すること、署名が正しく形成されていること、および署名者の公開鍵のダイジェストが、Bound−key−blobの「exportable」フィールドで名前を指定されていることを検証する。
【0295】
3.SSPが、鍵がエクスポート可能であることを検査する。そうでない場合には、SSPがSSP_CRYPO_ERRORを返す。
【0296】
4.鍵がPCRに束縛される場合に、SSPが、現在のPCRが鍵blobで名前を指定されていることを検査する。
【0297】
5.SSPが、元のBound−key−blob構造体のパラメータおよびBound−export−infoで供給された新しいPCR値を含む新しいBound−key−blob構造体を内部で生成する。他のすべてのパラメータは、同一のままになる。
【0298】
6.SSPが、Bound−export−infoで供給された公開暗号化鍵を用いて新しいBound−key−blobを暗号化する。
【0299】
7.新たに束縛された鍵をエクスポートする。
【0300】
8.SSP_SUCCESSを返す。
【0301】
一般的なコンピュータ環境
図12に、本明細書で説明する技法を実施するのに使用することができる、汎用コンピュータ環境400を示す。コンピュータ環境400は、コンピューティング環境の1つの例にすぎず、コンピュータアーキテクチャおよびネットワークアーキテクチャの使用の範囲または機能性に対する制限を暗示することを意図された物ではない。また、コンピュータ環境400を、例示的なコンピュータ環境400に示された構成要素の任意の1つまたは組合せに関する依存性または要件を有する物と解釈してはならない。
【0302】
コンピュータ環境400には、コンピュータ402の形の汎用コンピューティングデバイスが含まれる。コンピュータ402は、たとえば、図1のプリンシパル102およびガード104または図2の層を実施するのに使用することができる。コンピュータ402の構成要素には、1つまたは複数のプロセッサまたは処理ユニット404(任意選択として1つまたは複数のセキュリティプロセッサまたはセキュリティコロセッサ(SSPなど)および/または1つまたは複数の暗号プロセッサまたは暗号コプロセッサを含む)、システムメモリ406、プロセッサ404を含むさまざまなシステム構成要素をシステムメモリ406に結合するシステムバス408を含めることができるが、これらに制限はされない。
【0303】
システムバス408は、メモリバスまたはメモリコントローラ、周辺バス、accelerated graphics port、およびさまざまなバスアーキテクチャのいずれかを使用するプロセッサバスまたはローカルバスを含む、複数のタイプのバスアーキテクチャのいずれかの1つまたは複数を表す。たとえば、そのようなアーキテクチャに、Industry Standard Architecture(ISA)バス、マイクロチャネルアーキテクチャ(MCA)バス、Enhanced ISA(EISA)バス、Video Electronics Standards Association(VESA)ローカルバス、および、メザニンバスとも称するPeripheral Component Interconnects(PCI)バスを含めることができる。
【0304】
コンピュータ402には、通常は、さまざまなコンピュータ可読媒体が含まれる。そのような媒体は、コンピュータ402によってアクセス可能な任意の使用可能な媒体とすることができ、そのような媒体には、揮発性媒体および不揮発性媒体、取外し可能媒体および取外し不能媒体の両方が含まれる。
【0305】
システムメモリ406には、ランダムアクセスメモリ(RAM)410などの揮発性メモリ、および/または読取専用メモリ(ROM)412などの不揮発性メモリの形のコンピュータ可読媒体が含まれる。起動中などにコンピュータ402内の要素の間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム(BIOS)414が、ROM412に保存される。RAM410には、通常は、プロセッサ404から即座にアクセス可能および/またはプロセッサ404によって現在操作されるデータおよび/またはプログラムモジュールが含まれる。
【0306】
コンピュータ402には、他の取外し可能/取外し不能、揮発性/不揮発性のコンピュータ記憶媒体も含めることができる。たとえば、図12に、取外し不能不揮発性磁気媒体(図示せず)から読み取り、それに書き込むハードディスクドライブ416、取外し可能不揮発性磁気ディスク420(たとえば「フロッピー(登録商標)ディスク」)から読み取り、それに書き込む磁気ディスクドライブ418、およびCD−ROM、DVD−ROM、または他の光学媒体などの取外し可能不揮発性光ディスク424から読み取り、かつ/またはそれに書き込む光ディスクドライブ422が示されている。ハードディスクドライブ416、磁気ディスクドライブ418、および光ディスクドライブ422は、それぞれ、1つまたは複数のデータ媒体インターフェース426によってシステムバス408に接続される。その代わりに、ハードディスクドライブ416、磁気ディスクドライブ418、および光ディスクドライブ422を、1つまたは複数のインターフェース(図示せず)によってシステムバス408に接続することができる。
【0307】
ディスクドライブおよびそれに関連するコンピュータ可読媒体によって、コンピュータ402の、コンピュータ可読命令、データ構造体、プログラムモジュール、および他のデータの不揮発性ストレージが提供される。この例には、ハードディスク416、取外し可能磁気ディスク420、および取外し可能光ディスク424が示されているが、磁気カセットまたは他の磁気記憶装置、フラッシュメモリカード、CD−ROM、ディジタル多用途ディスク(DVD)または他の光ストレージ、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、電気消去可能プログラマブル読取専用メモリ(EEPROM)、および類似物などの、コンピュータによってアクセス可能なデータを保存できる他のタイプのコンピュータ可読媒体を使用して、例示的なコンピューティングシステムおよび環境を実施することもできることを諒解されたい。
【0308】
たとえばオペレーティングシステム426、1つまたは複数のアプリケーションプログラム428、他のプログラムモジュール430、およびプログラムデータ432を含む、任意の数のプログラムモジュールを、ハードディスク416、磁気ディスク420、光ディスク424、ROM412、および/またはRAM410に保存することができる。そのようなオペレーティングシステム426、1つまたは複数のアプリケーションプログラム428、他のプログラムモジュール430、およびプログラムデータ432のそれぞれ(またはこれらのある組合せ)によって、分散ファイルシステムをサポートする常駐構成要素のすべてまたは一部を実施することができる。
【0309】
ユーザは、キーボード434およびポインティングデバイス436(たとえば「マウス」)などの入力装置を介してコンピュータ402にコマンドおよび情報を入力することができる。他の入力装置438(具体的には図示せず)に、マイクロホン、ジョイスティック、ゲームパッド、衛星放送送受信用パラボラアンテナ、シリアルポート、スキャナ、および/または類似物を含めることができる。これらおよび他の入力装置は、システムバス408に結合される入出力インターフェース440を介して処理ユニット404に接続されるが、パラレルポート、ゲームポート、またはuniversal serial bus(USB)などの他のインターフェースおよびバス構造によって接続することもできる。
【0310】
モニタ442または他のタイプの表示装置も、ビデオアダプタ444などのインターフェースを介してシステムバス408に接続することができる。モニタ442に加えて、他の出力周辺装置に、スピーカ(図示せず)およびプリンタ446など、入出力インターフェース440を介してコンピュータ402に接続することができる構成要素を含めることができる。
【0311】
コンピュータ402は、リモートコンピューティングデバイス448などの1つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。たとえば、リモートコンピューティングデバイス448を、パーソナルコンピュータ、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイスまたは他の一般的なネットワークノード、および類似物とすることができる。リモートコンピューティングデバイス448は、コンピュータ402に関して本明細書で説明する要素および特徴の多くまたはすべてを含めることができるポータブルコンピュータとして図示されている。
【0312】
コンピュータ402とリモートコンピュータ448の間の論理接続は、ローカルエリアネットワーク(LAN)450および一般的な広域ネットワーク(WAN)452として図示されている。そのようなネットワーキング環境は、オフィス、会社全体のコンピュータネットワーク、イントラネット、およびインターネットでありふれた物である。
【0313】
LANネットワーキング環境で実施される場合に、コンピュータ402は、ネットワークインターフェースまたはネットワークアダプタ454を介してローカルネットワーク450に接続される。WANネットワーキング環境で実施される場合に、コンピュータ402に、通常は、広域ネットワーク452を介する通信を確立するための、モデム456または他の手段が含まれる。モデム456は、コンピュータ402の内蔵または外付けとすることができるが、入出力インターフェース440または他の適当な機構を介してシステムバス408に接続することができる。図示されたネットワーク接続が、例示的であることと、コンピュータ402および448の間で通信リンクを確立する他の手段を使用できることを諒解されたい。
【0314】
コンピューティング環境400と共に図示された物などのネットワーク化された環境では、コンピュータ402に関して図示されたプログラムモジュールまたはその一部を、リモートメモリストレージデバイスに保存することができる。例として、リモートアプリケーションプログラム458が、リモートコンピュータ448の記憶装置に常駐する。例示のために、アプリケーションプログラムおよび、オペレーティングシステムなどの他の実行可能プログラムコンポーネントが、この図では別個のブロックとして図示されているが、そのようなプログラムおよびコンポーネントが、さまざまな時にコンピューティング装置402の異なるストレージ構成要素に常駐し、コンピュータのデータプロセッサによって実行されることを理解されたい。
【0315】
さまざまなモジュールおよび技法を、プログラムモジュールなど、1つまたは複数のコンピュータまたは他の装置によって実行されるコンピュータ実行可能命令の全般的な文脈で本明細書で説明することができる。一般に、プログラムモジュールには、特定の作業を実行するか特定の抽象データ型を実施する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造体などが含まれる。通常、プログラムモジュールの機能性は、さまざまな実施形態で望みに応じて組み合わせるか分散させることができる。
【0316】
これらのモジュールおよび技法の実施形態を、何らかの形のコンピュータ可読媒体に保存するか、それを介して伝送することができる。コンピュータ可読媒体は、コンピュータによってアクセス可能なすべての使用可能な媒体とすることができる。制限ではなく例として、コンピュータ可読媒体に、「コンピュータ記憶媒体」および「通信媒体」を含めることができる。
【0317】
「コンピュータ記憶媒体」には、コンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータなどの情報の記憶のためのあらゆる方法または技術で実施される、揮発性および不揮発性の、取外し可能および取外し不能の媒体が含まれる。コンピュータ可読媒体には、RAM、ROM、EEPROM、フラッシュメモリまたは他のメモリ技術、CD−ROM、ディジタル多用途ディスク(DVD)または他の光学記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶装置、または、所望の情報を保存するのに使用でき、コンピュータによってアクセスすることができる他の媒体が含まれるが、これに制限はされない。
【0318】
「通信媒体」は、通常は、搬送波または他のトランスポート機構など、変調されたデータ信号内でコンピュータ可読命令、データ構造体、プログラムモジュール、または他のデータを実施する。通信媒体に、情報配送媒体も含まれる。用語「変調されたデータ信号」は、信号内に情報を符号化する形でその特性の1つまたは複数を設定または変更される信号を意味する。制限ではなく例として、通信媒体に、有線ネットワークまたは直接配線接続などの有線媒体と、音響、RF、赤外線、および他の無線媒体などの無線媒体が含まれる。上記の任意の組合せも、コンピュータ可読媒体の範囲に含まれる。
【0319】
上の説明では、構造的特徴および/または方法論的動作に固有の言語を使用したが、請求項で定義される発明が、記載された特定の特徴または動作に制限されないことを理解されたい。そうではなく、特定の特徴および動作は、本発明の実施の例示的形態として開示される。
【符号の説明】
【0320】
200 Seal動作を実施する例示的なプロセス
220 UnSeal動作を実施する例示的なプロセス
250 Store動作を実施する例示的なプロセス
270 Seal動作を実施する例示的なプロセス
300 Quote動作を実施する例示的なプロセス
320 Verify動作を実施する例示的なプロセス
340 PKUnseal動作を実施する例示的なプロセス
360 PKSeal動作を実施する例示的なプロセス
380 GenSeal動作を実施する例示的なプロセス
【特許請求の範囲】
【請求項1】
コンピュータデバイスにおいて実行される方法であって、
呼び出しプログラムからビットストリングを受け取るステップと
前記呼び出しプログラムの識別子をチェックして、前記呼び出しプログラムが、前記ビットストリングの暗号テキストの中に暗号化されているデータにアクセスすることが許されているプログラムか否かを判定するステップであって、前記呼び出しプログラムの識別子が複数のターゲットプログラムの識別子の1つとして前記暗号テキストの中に含まれている場合には前記呼び出しプログラムは前記データにアクセスすることが許されていると判定する、判定するステップと、
前記データの無傷を確認するステップと、
対称鍵を使用して前記データを暗号解読するステップと、
前記呼び出しプログラムが前記データにアクセスすることが許されている場合および前記データの無傷が確認された場合にのみ前記データを前記呼び出しプログラムに返すステップと
を有することを特徴とする方法。
【請求項2】
前記呼び出しのプログラムの識別子は暗号化ハッシュ機能を前記呼び出しのプログラムに適用することにより生成されるダイジェスト値を有することを特徴とする請求項1に記載の方法。
【請求項3】
前記ビットストリングは暗号化テキストおよび該暗号化テキストのためのメッセージ確認コード(MAC)値の組み合わせを有することを特徴とする請求項1に記載の方法。
【請求項4】
前記ビットストリングは暗号化テキストおよび前記データのためのメッセージ確認コード(MAC)値の組み合わせを有することを特徴とする請求項1に記載の方法。
【請求項5】
前記ビットストリングは前記データおよび前記データのためのメッセージ確認コード(MAC)値の組み合わせから生成される暗号化テキストを有することを特徴とする請求項1に記載の方法。
【請求項6】
前記確認するステップは、
前記暗号化テキストを暗号解読することにより前記データを取得するステップと、
当該取得されたデータのためのメッセージ確認コード(MAC)値を生成するステップと、
当該生成されたメッセージ確認コード(MAC)値と前記ビットストリングの一部として受け取ったメッセージ確認コード(MAC)値とを比較するステップと、
前記生成されたメッセージ確認コード(MAC)値と前記ビットストリングの一部として受け取ったメッセージ確認コード(MAC)値とが一致する場合にのみ前記データは無傷と確認するステップと
を有することを特徴とする請求項1に記載の方法。
【請求項7】
前記メッセージ確認コード(MAC)値を生成するステップは前記対称鍵の第1の部分を使用して前記メッセージ確認コード(MAC)値を生成するステップと、前記データを暗号解読するステップは前記対称鍵の第2の部分を使用して前記データを暗号解読するステップを有することを特徴とする請求項6に記載の方法。
【請求項1】
コンピュータデバイスにおいて実行される方法であって、
呼び出しプログラムからビットストリングを受け取るステップと
前記呼び出しプログラムの識別子をチェックして、前記呼び出しプログラムが、前記ビットストリングの暗号テキストの中に暗号化されているデータにアクセスすることが許されているプログラムか否かを判定するステップであって、前記呼び出しプログラムの識別子が複数のターゲットプログラムの識別子の1つとして前記暗号テキストの中に含まれている場合には前記呼び出しプログラムは前記データにアクセスすることが許されていると判定する、判定するステップと、
前記データの無傷を確認するステップと、
対称鍵を使用して前記データを暗号解読するステップと、
前記呼び出しプログラムが前記データにアクセスすることが許されている場合および前記データの無傷が確認された場合にのみ前記データを前記呼び出しプログラムに返すステップと
を有することを特徴とする方法。
【請求項2】
前記呼び出しのプログラムの識別子は暗号化ハッシュ機能を前記呼び出しのプログラムに適用することにより生成されるダイジェスト値を有することを特徴とする請求項1に記載の方法。
【請求項3】
前記ビットストリングは暗号化テキストおよび該暗号化テキストのためのメッセージ確認コード(MAC)値の組み合わせを有することを特徴とする請求項1に記載の方法。
【請求項4】
前記ビットストリングは暗号化テキストおよび前記データのためのメッセージ確認コード(MAC)値の組み合わせを有することを特徴とする請求項1に記載の方法。
【請求項5】
前記ビットストリングは前記データおよび前記データのためのメッセージ確認コード(MAC)値の組み合わせから生成される暗号化テキストを有することを特徴とする請求項1に記載の方法。
【請求項6】
前記確認するステップは、
前記暗号化テキストを暗号解読することにより前記データを取得するステップと、
当該取得されたデータのためのメッセージ確認コード(MAC)値を生成するステップと、
当該生成されたメッセージ確認コード(MAC)値と前記ビットストリングの一部として受け取ったメッセージ確認コード(MAC)値とを比較するステップと、
前記生成されたメッセージ確認コード(MAC)値と前記ビットストリングの一部として受け取ったメッセージ確認コード(MAC)値とが一致する場合にのみ前記データは無傷と確認するステップと
を有することを特徴とする請求項1に記載の方法。
【請求項7】
前記メッセージ確認コード(MAC)値を生成するステップは前記対称鍵の第1の部分を使用して前記メッセージ確認コード(MAC)値を生成するステップと、前記データを暗号解読するステップは前記対称鍵の第2の部分を使用して前記データを暗号解読するステップを有することを特徴とする請求項6に記載の方法。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【公開番号】特開2012−99128(P2012−99128A)
【公開日】平成24年5月24日(2012.5.24)
【国際特許分類】
【出願番号】特願2011−280456(P2011−280456)
【出願日】平成23年12月21日(2011.12.21)
【分割の表示】特願2011−158404(P2011−158404)の分割
【原出願日】平成15年4月17日(2003.4.17)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】
【公開日】平成24年5月24日(2012.5.24)
【国際特許分類】
【出願日】平成23年12月21日(2011.12.21)
【分割の表示】特願2011−158404(P2011−158404)の分割
【原出願日】平成15年4月17日(2003.4.17)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】
[ Back to top ]