[0029]エンクレーブクライアントの開発、およびエンクレーブ内で実行するソフトウェアの開発を簡略化するエンクレーブの抽象化モデルが開示される。抽象化モデルは、IntelのSGXおよびMicrosoftのVSMなどのネイティブエンクレーブプラットフォーム・アーキテクチャの簡略化および一体化であり得る。抽象化層ソフトウェアコンポーネントは、エンクレーブクライアントと1つまたは複数のネイティブプラットフォームとの間、エンクレーブの内側のソフトウェアと1つまたは複数のネイティブエンクレーブプラットフォームとの間、およびエンクレーブの内側のソフトウェアとエンクレーブクライアントとの間の通信を翻訳し得る。そのような抽象化プラットフォームは、エンクレーブソフトウェアおよびエンクレーブクライアントソフトウェアのシングルバージョンがSGXおよびVSMなどの複数のネイティブエンクレーブプラットフォームの上で実行することを可能にするという利益を提供し得る。エンクレーブおよびエンクレーブクライアントのための書き込みソフトウェアのタスクを簡略化することに加えて、これは、エンクレーブのエンドユーザーが、特定のコンピューターのネイティブエンクレーブプラットフォームのために作られるエンクレーブおよびエンクレーブクライアントソフトウェアの両方のバージョンを探し出す必要性なしに、任意のサポート対象のネイティブエンクレーブアーキテクチャをサポートするコンピューター上でエンクレーブおよびエンクレーブクライアントソフトウェアを実行することを可能にする。
[0030]エンクレーブ抽象化モデルは、例えば、エンクレーブのライフサイクルを管理すること、エンクレーブのローカルおよびリモートアテステーション、エンクレーブへデータを密封すること、エンクレーブ内へのおよびエンクレーブの外へのプログラム転送制御、ならびに単調カウンターおよび信頼できる時刻などの他のセキュリティ特徴のためのプリミティブを含む。エンクレーブのコンテンツのシングルバイナリまたはシングルハッシュの域を越えたエンクレーブのアイデンティティを抽象化するエンクレーブの抽象または層状アイデンティティも提示される。アプリケーションプログラミングインターフェース(API)またはアプリケーションバイナリインターフェース(ABI)などのソフトウェアコンポーネントインターフェースは、抽象化モデルプリミティブを使用したエンクレーブおよびエンクレーブクライアントプログラムの開発のために提示される。
[0031]抽象アイデンティティは、エンクレーブインスタンスのグループをセキュアに識別するために使用され得るネスト化アイデンティティまたはアイデンティティ階層を含み得る。本明細書におけるエンクレーブインスタンスは、同じマシン上のエンクレーブ内へロードされる同じエンクレーブバイナリコードを指し得、同じアイデンティティを有し得る。その一方で、バイナリコードの新しいバージョン、または異なるマシン上にロードされる同じバイナリコードは、異なるインスタンスと見なされ得る。これらの異なるインスタンスはまた、アイデンティティ階層内のより高いレベルにおいては同じアイデンティティを有し得る。抽象化されたエンクレーブアイデンティティは、関連したエンクレーブバイナリのグループが関連するものとして識別されることを可能にする。例えば、バグが修正される前後のエンクレーブバイナリのバージョンなど、同じエンクレーブの異なるバージョンは、バージョンとは無関係に、同じ名前を与えられ得る。抽象化のより高い層において、エンクレーブのファミリー内のすべてのエンクレーブは、単一のファミリー名またはアイデンティティを与えられ得る。この場合、関連するが異なる関数を実施するすべてのエンクレーブは、一緒に識別され得る。他のアイデンティティ層またはアイデンティティのグループ分けは、以下に説明される。
[0032]抽象アイデンティティの任意の層は、データを密封すること、エンクレーブのアテステーション、またはデータ新鮮性を保証すること(単調カウンターによる)など、様々な暗号化動作のために使用され得る。例えば、1つのエンクレーブインスタンスによってもたらされるデータをより高いレベルのアイデンティティへ密封することによって、その後そのデータは、同じより高レベルのエンクレーブアイデンティティを有する異なるエンクレーブインスタンスによってセキュアに消費され得る。例えば、エンクレーブファミリーへデータを密封することによって、そのファミリーのメンバーである任意のエンクレーブインスタンスが、およびそのファミリーのメンバーのみが、そのデータを開封することができることになる。エンクレーブインスタンスからのファミリーアイデンティティへのアテステーションは、そのエンクレーブインスタンスがファミリーのメンバーであるということを保証する。アイデンティティ抽象化に結び付けられる単調カウンターは、抽象化アイデンティティのメンバーであるすべてのエンクレーブインスタンスに関連する新鮮性保証を提供し得る。
[0033]開示される抽象化モデルは、アプリケーションプログラミングインターフェース(API)またはアプリケーションバイナリインターフェース(ABI)など、エンクレーブおよびエンクレーブホストのソフトウェア開発を簡略化し得るソフトウェアコンポーネントインターフェースを含む。APIは、プログラミングサブルーチン定義、プロトコル、およびソフトウェを作成するためのツールのセットである。APIは、ソフトウェアコンポーネントの特定の実装形態とは無関係に、ソフトウェアコンポーネントの入力および出力、ソフトウェアコンポーネントによって使用されるデータタイプ、ならびにソフトウェアコンポーネントの機能性または動作を規定し得る。APIは、C、C++、C#、および同様のものなど、高水準コンピューター言語で規定され得る。APIの形式化された定義は、ソフトウェアコンポーネント間、例えば、異なる時刻に、または異なるオーサーによって書かれた2つのソフトウェアコンポーネント間の相互作用を促進し得る。APIは、Microsoftインターフェース定義原語(MIDL)またはオブジェクトマネージメントグループ(OMG)IDLなどのインターフェース記述言語(IDL)を部分的に用いて形式化され得る。ABIはまた、ソフトウェアコンポーネント間のインターフェースであるが、オブジェクトコードインターフェースである。例えば、ABIは、オブジェクトコードのエントリーポイント(または命令アドレス)であり得、このオブジェクトコードは、エントリーポイントが呼び出されるときに、引数を保持するマシンレジスタを特定するプロトコルなど、それらのエントリーポイントを使用するためのプロトコルと一緒にAPIのソースコード実装をコンパイルすることから生じる。
[0034]上に説明されるように異なるレベルのエンクレーブアイデンティティとの相互作用を可能にすることに加えて、エンクレーブAPIは、エンクレーブプラットフォームアーキテクチャ間、例えば、IntelのSoftware Guard Extensions(SGX)、MicrosoftのVirtual Secure Mode(VSM)、およびARM TrustZone、AMDのSecure Encrypted Virtualization(SEV)によって提供されるセキュアに隔離された実行のためのアーキテクチャと、フィールドプログラマブルゲートアレイ(FPGA)に基づいたアーキテクチャとの間の差を抽象化で取り去り得る。APIは、抽象化されたエンクレーブアーキテクチャのいくつかの詳細事項を抽象化するエンクレーブプラットフォームのためのインターフェースを含む。これらのエンクレーブプラットフォームインターフェースは、エンクレーブホストAPI、エンクレーブプラットフォームAPI、およびリモートアテステーションAPIを含む。エンクレーブホストAPIは、エンクレーブのライフサイクルを管理するため、ならびにエンクレーブへの通信およびエンクレーブからの通信を提供するために、信頼できないホストプロセスによって使用され得る。エンクレーブプラットフォームAPIは、信頼できるエンクレーブプラットフォームによってエンクレーブに提供され得、アテステーション、密封、およびエンクレーブコンピューターをホストするコンピューター上で実行する信頼できないコードとの通信のためのセキュリティプリミティブ、ならびにメモリ管理およびスレッドスケジューリングなどのコアランタイムサポートを含み得る。リモートアテステーションAPIは、エンクレーブおよびそのクライアントが同じコンピューター上でホストされない場合に、リモートアテステーションを実施するために使用され得る。例えば、リモートアテステーションAPIは、データがリモートコンピューター上のエンクレーブプラットフォームによって提供される隔離下で実行する特定のアイデンティティを有するエンクレーブから生じた(またはそこから送信された)ことを検証するためにローカルクライアントによって使用され得る。より一般的には、リモートアテステーションAPIは、ローカルクライアントとリモートエンクレーブとの間のセキュア通信チャネルを確立するために使用され得る。
[0035]エンクレーブは、一般に、コンピューター技術の領域に特有の問題、およびコンピューター技術の領域から生じる問題に対するソリューションを提供する。より具体的には、エンクレーブは、信頼できるコードセグメントおよび信頼できないコードセグメントの両方が単一のコンピュータープロセッサーのアドレス空間内に存在する場合に、信頼できるコードを信頼できないコードから分離するための機序を提供する。例えば、エンクレーブは、極秘またはプライベートデータにアクセスしなければならないコードと同じ汎用コンピューター上で実行する潜在的に信頼できないコード(バグまたはウイルスのいずれかを潜在的に含むコードなど)の問題に対してセキュリティソリューションを提供する。本開示の実施形態は、単一のエンクレーブまたはエンクレーブクライアントが複数のネイティブエンクレーブプラットフォームにより著作されることを可能にすることによってソフトウェア開発を簡略化すること、特定のコンピューターの特有のハードウェア特徴にカスタマイズされなければならないソフトウェアコンポーネントの数を減少させることによって企業のコンピューター管理を簡略化すること、ならびに、複数のコンピューター上でホストされるエンクレーブにわたってセキュアなエンクレーブ処理を分散させることなどの、分散データ密封を用いた新たなセキュアコンピューティングシナリオを可能にすることを含め、コンピューター技術の領域から生じるそのようなセキュリティ問題に対してさらに改善されたソリューションを提供する。
[0036]図1は、いくつかの信頼関係と一緒にエンクレーブシステムのハイレベルブロック図を描写する。エンクレーブシステム100は、コード180およびデータ182を含むメモリのセキュアな隔離領域を含むエンクレーブ176(代替的にエンクレーブコンテナまたはセキュア実行環境と呼ばれる)を含む。コード180は、公開またはプライベートであり得、データ182は、公開またはプライベートであり得る。例えば、プライベートデータまたはコードは、データ所有者142に属し得る(または、プライベートであり得る)一方、公開データまたはコードは、ソフトウェアプロバイダー148などの別のパーティに提供されている場合がある。1つの実施形態において、エンクレーブコンテナ176内で実行するコードは、完全に公開であってプライベートではない場合がある一方、公開エンクレーブコードが入力として使用するか、または出力としてもたらすデータは、プライベートであり得る。別の実施形態において、コードがプライベートである一方でデータが公開である場合には、逆のことが可能である。さらに別の実施形態において、コードおよび入力データの両方が公開であり得る一方、入力データを用いてコードを実行する出力は、プライベートであり得る。コード、入力データ、および出力データの他の公開およびプライベートの組合せが可能である。
[0037]エンクレーブ176コンテナは、信頼できるハードウェア172上でホストされ、このハードウェア172は、信頼できないソフトウェア174を同時にホストし得る。エンクレーブシステム100の主な目的は、コード180の完全性を維持すること、コード180の機密性を維持すること、データ182の完全性を維持すること、およびデータ182の機密性を維持することを含むリストから選択される少なくとも1つの態様を含み得る。信頼できないソフトウェア174(例えば、信頼できないソフトウェアへの開示、信頼できないソフトウェアによる修正、または同様のこと)からエンクレーブ176のコンテンツを保護することが目標である。信頼できるハードウェアは、製造業者162によって構築され、インフラ所有者152によって所有および管理される。
[0038]エンクレーブクライアント104は、エンクレーブ176がコード180およびデータ182を用いてその計算を実施するエンクレーブコンテナの外側のプロセスまたはプログラムであり得る。ローカルエンクレーブ実施形態において、エンクレーブクライアント104はまた、信頼できるハードウェア172上で実行していてもよい。リモートエンクレーブ実施形態において、エンクレーブクライアントは、1つのコンピューター上で実行し得る一方、信頼できるハードウェア172は、ネットワークを介してエンクレーブクライアントのコンピューターに接続される異なるリモートコンピューターである。ローカルエンクレーブの場合、エンクレーブクライアントプロセスはまた、エンクレーブクライアントプロセスがローカルエンクレーブ176の作成を管理し得るという点において、エンクレーブコンテナ176のエンクレーブホストプロセスであり得る。リモートエンクレーブの場合、エンクレーブ176は、例えば、インフラ所有者152がクラウドコンピューティングサービスプロバイダーである場合、インターネットクラウドコンピューター上で実行され得、クラウドコンピューターは、製造業者162によって製造される信頼できるハードウェア172を含む。
[0039]エンクレーブクライアント104は、リクエストされた計算をエンクレーブ176によってセットアップするセットアップ106方法を含み得る。セットアップ106方法は、エンクレーブ176のセキュアコンテナの作成を引き起こすことと、バイナリコードをセキュアコンテナ内へコピーすることを含み得る、エンクレーブのインスタンス化を引き起こすこと(例えば、エンクレーブのインスタンス化を要求するために、信頼できないソフトウェア174にリクエストを送信することによって)と、例えばセキュアコンテナ内へコピーされたコード内の方法を呼び出すことによって、エンクレーブ内の計算を引き起こすことまたはリクエストすることとを含み得る。リクエストされた計算は、コード180を実行することを含み得、データ182は、リクエストされた計算に入力され得るか、またはリクエストされた計算の結果であり得る。リクエストされた計算に入力されるデータは、エンクレーブの外側にあるときには暗号化され得、暗号化された入力データは、エンクレーブの内側で使用される前に復号され得る。エンクレーブ176がリクエストされたタスクを完了すると、このタスクの結果を表すデータが、暗号化され、エンクレーブクライアント104へ送り返される。エンクレーブクライアント104が暗号化された結果を受信すると、検証108方法は、受信した結果の完全性および新鮮性を確認し得る。単一のソフトウェアプロバイダー148が、エンクレーブ176の内側で実行するためのコード180、およびエンクレーブクライアント104の部分として実行する検証108方法の少なくとも一部分の両方を提供し得る。
[0040]データ182のプライベート部分およびコード180のプライベート部分のプライバシーに対するデータ所有者の確信、ならびにエンクレーブ176によってもたらされる結果の正確さに対する確信は、信頼関係に基づき得る。例えば、データ所有者142は、エンクレーブコンテナ自体の中では実行していない場合があるエンクレーブクライアント104を信頼し得る。データ所有者は、さらに、エンクレーブ自体のソフトウェアプロバイダー148を信頼し得る。また、データ所有者は、信頼できるハードウェア172の製造業者を信頼し得る。信頼できるハードウェア172は、使用されるエンクレーブアーキテクチャに応じて多くの形態をとり得、ハードウェアセキュリティモジュール(HSM)を含み得、この場合HSMは、例えば、トラステッドプラットフォームモジュール(TPM)規格に準拠する。信頼できるハードウェア172は、例えば、TPMを含み得、そうでない場合はハードウェアのみを備え得る。例えば、MicrosoftのVSMエンクレーブアーキテクチャを使用した信頼できるハードウェア172の実装形態は、オペレーティングシステム仮想化命令のための命令を有するコモディティプロセッサーおよびTPMを含み得る。MicrosoftのVSMエンクレーブアーキテクチャは、ゲストパーティションを管理するためのハイパーバイザー(仮想プロセッサー)を含み得、ハイパーバイザーは、ハイパーコールインターフェースをゲストパーティションに露出して、ゲストパーティションがハイパーバイザーと相互作用することを可能にし得る。MicrosoftのVSMアーキテクチャ内のエンクレーブコンテナは、特別なタイプのゲストパーティションとして実装され得る。IntelのSGXエンクレーブアーキテクチャを有する信頼できるハードウェア172の例は、特別なエンクレーブ特有の命令およびセキュリティ機能性を有するプロセッサーを含み得る。
[0041]エンクレーブ176などのエンクレーブは、保護された領域からの読み込み、書き込み、または実行に対する制限をメモリの領域に提供することによってコード180およびデータ182などのコードまたはデータを保護し得る隔離された実行環境を提供し得る。この保護されたメモリ領域は、機密コードおよびデータのためのセキュアコンテナである。エンクレーブの保護されたメモリ領域からの実行に対する制限は、エンクレーブの外側のコードからエンクレーブの内側のコードへの、およびその逆の間での呼び出しまたは飛び越し命令などの実行転送に対する制限を含み得る。異なる制限が、エンクレーブの外側からのエンクレーブへのコールイン、およびエンクレーブの内側からのエンクレーブのコールアウトの間で履行され得る。エンクレーブの内側と外側との間のこれらの実行転送の履行は、ハードウェアによって、例えば、コモディティ仮想化ハードウェア技術を用いて、またはINTELのSGXプラットフォームなどの特殊ハードウェアを用いて、提供され得る。
[0042]図2は、機密性保証付きのメッセージ引き渡しのための例示的なプロセス200を描写する。機密性保証は、本例ではアン210およびベン230などの2つのパーティ間の通信が、メッセージがネットワーク218などの公開または非保護通信媒体を通じて引き渡されるときに第三者から隠されたままであるというある程度の確証を提供する。本例では、アン212は、ベン230に機密メッセージを送信したいと思っている。機密データを含むメッセージブロック212は、暗号化214動作によって公開鍵216を使用して暗号化される。暗号化214動作は、例えば、Advanced Encryption Standard Galois/Counter Mode(AES−CGM)であり得るが、デジタル暗号化の当業者に知られている任意の暗号化動作であってもよい。暗号化されたブロック220は、ネットワーク218を通じてベンへと渡り得、ここで、暗号化されたブロック234は、ベンのために暗号化されていないメッセージブロック232をもたらすためにプライベート鍵236を用いて復号される。鍵および暗号化アルゴリズムの慎重な選択により、コンピューターデータ暗号化の分野において知られているように、メッセージは、公開ネットワークを通過するときにさえ機密のままであることができる。
[0043]図3は、完全性保証付きのメッセージ引き渡しのための例示的なプロセス300を描写する。完全性保証は、本例ではアン310およびベン350などの2つのパーティ間の通信が、メッセージがネットワーク340などの公開または非保護通信媒体を通じて引き渡されるときに改ざんされない、または別のやり方で変更されないというある程度の確証を提供する。図3の例において、アン310は、メッセージ314が、ベン350がそれを受信するときに改ざんされない、または別のやり方で破損されないという自信があるように、メッセージ314をベン350に送信する。この完全性保証を提供するため、セキュアハッシング316プロセスがメッセージ314に作用して、ハッシュ値318をもたらす。次いで、ハッシュ値318は、署名342を生成するためにアンのプライベート鍵を使用した署名320プロセスによって署名される。署名342は、メッセージ344であるメッセージ314のコピーと一緒に公開ネットワーク340または他の非保護通信プロセスで送信され得る。次いで、ベンはメッセージ354を受信し、このメッセージ354について、ベンは、メッセージ354が、信頼できないネットワーク340を通過した後に、アンが送信したメッセージ314と同じであるという自信を有することができるように、完全性を検証することを望む。完全性を検証するため、受信したメッセージ354は、セキュアハッシング316と同一であるセキュアハッシング356によって処理されて、ハッシュ値358をもたらす。受信した署名342は、アンの公開鍵を使用した署名検証360プロセスによって検証される。次いで、署名342から抽出されるハッシュ値318は、署名が同じであることを検証する380ためにハッシュ値358と比較される。それらが同じである場合、メッセージは完全性を有するものとして承認される384。代替的に、メッセージ314がメッセージ354として受信される前に何らかのやり方で変更された場合、署名は正しくなく、メッセージは拒絶されることになる388。
[0044]いくつかの実施形態において、セキュアハッシング316およびセキュアハッシング356は、暗号学的ハッシュ関数であり得る。暗号学的ハッシュ関数は、任意サイズのデータを固定サイズのビットストリング(典型的には、はるかに小さい)にマッピングする一方向関数である。ハッシュ関数の出力は、ハッシュ値または単にハッシュと呼ばれ得る。優れたハッシュ関数は、ハッシュ出力のみを前提として任意サイズの入力を決定するのが困難であるという点において一方向である。優れたハッシュ関数では、入力における小さな変化でさえ出力における変化をもたらす。
[0045]通信システムは、機密性および完全性保証を組み合わせることができる。例えば、図2のメッセージブロック暗号化は、図3のメッセージハッシュの署名と組み合わされ得る。組合せシステムは、1つは送信者用、1つは受信者用の、公開/プライベート鍵ペアの2つのセットを必要とし得る。組合せシステムは、メッセージを復号するために受信者側で1つのプライベート鍵を使用し得る一方で(図2のようにベンのプライベート鍵)、メッセージハッシュに署名するために別のプライベート鍵を使用する(図3のようにアンのプライベート鍵)。
[0046]図4は、新鮮性保証付きのメッセージ引き渡しのための例示的なプロセス400を描写する。新鮮性保証は、複数のメッセージが、本例ではアン410からベン450へなど、1つのパーティから別のパーティへ送信されるとき、受信者側で受信されるメッセージが直近のメッセージであるというある程度の確証を提供する。新鮮性保証は、完全性保証を基に構築され得、リプレイアタックを防ぐことができる。完全性保証により、悪意を持った第三者が、独自のメッセージを作成して、ベンがそのメッセージはアンによって作成されたものであると理解するように、それをベンに送信することは困難である。しかしながら、第三者は、アンによって実際に作成され、それが公開ネットワークを介して送信された際におそらく観察されたメッセージを取り込むことができ、第三者は、それを後になって別のときにベンに送信し得る(すなわち、メッセージをリプレイする)。ベンは、そのメッセージが実際にアンによって作成されたことを決定する(そうであったため)が、ベンは、アンがそのときにそれを送信した人物ではないことは知らない。これは、第三者によるベンまたはアンに対するリプレイアタックと呼ばれ得る。図4は、ノンスおよびタイムスタンプを使用して新鮮性保証を提供することによってリプレイアタックを防ぐための例示的なソリューションである。ノンスは、1回限りの乱数であり、同じ数字がノンスとして決して2回以上使用されないことを確実にするためのシステムと連動される。いくつかのシステムにおいて、ノンスは、使用されるすべての数字がそれより前に出たすべての数字よりも大きくなるように、単に単調増加する数字であり得る。
[0047]図4では、アンのメッセージ414は、ノンス434およびタイムスタンプ432と一緒にメッセージ436として公開ネットワーク430を介して送信され得る。ノンス434は、暗号学的にセキュアな擬似ランダム数発生器(CSPRNG)426によって生成され、タイムスタンプ432は、同期化クロック424によってもたらされる。デジタル暗号法の当業者に知られているCSPRNGシステムは数多く存在する。ネットワーク430のアン側の同期化クロック424は、ネットワークのベン側の同期化クロック480と同期される。ベン側では、メッセージ454が受信されると、付随するノンス434が、近時ノンス470のキャッシュ内に格納される。受信したメッセージ450の新鮮性は、2つの試験により検証され得る。まず、ノンス434は、現在受信したノンス434が前に見たものであるかどうかを決定するために、ノンス434を近時ノンス470のキャッシュと比較することによって、ボックス460において試験される。受信したノンス434が前に見たものである場合、メッセージ454は、ボックス468においてリプレイメッセージとして拒絶される。受信したノンス434が前に見たものでない場合、メッセージは、この第1の試験では、OKであることがボックス464において決定される。次に、受信したタイムスタンプ432が、ローカル同期化クロック490と比較される。タイムスタンプが近時である場合、メッセージ454は、ボックス494において容認できることが決定され、そうでない場合、メッセージ454は、ボックス498において期限切れとして拒絶される。近時タイムスタンプがボックス490において近時であるかどうかを決定するときに許容される遅延の量は、同期化クロック424と同期化クロック480との間の予期されるクロックスキューならびにメッセージ処理およびネットワーク430を介した伝送における時間遅延に依存し得る。
[0048]通信システムは、新鮮性保証を、図2のような機密性保証および図3のような完全性保証のいずれかまたは両方と組み合わせることができる。3つすべてを組み合わせるシステムにおいて、ネットワーク430を介して送信されるメッセージ436は、アンの元のメッセージ414の暗号化バージョンであり、メッセージ414の署名付きハッシュを含む署名が、タイムスタンプ432、ノンス434、およびメッセージ436と一緒に含まれる。
[0049]図5は、エンクレーブのソフトウェアアテステーションのための例示的なプロセス500を描写する。ソフトウェアアテステーションは、図6のものなどの鍵合意プロトコルと組み合わされるとき、それが、信頼できるハードウェアによって作成された隔離されたコンテナの内側でホストされる特定のソフトウェアにより共有秘密を確立したということを検証者に保証することができる。図5の実施形態において、エンクレーブクライアント510(アテステーション検証者)は、トラステッドプラットフォーム530上でエンクレーブのセキュアな計算サービスを使用することを望み得る。トラステッドプラットフォーム530は、コンピューター(描写されない)上でホストされ、その結果、トラステッドプラットフォーム530は、ホスティングコンピューターのサブセットを備え得る。トラステッドプラットフォーム530は、ホスティングコンピューターのハードウェア要素およびソフトウェア要素を備え得る。エンクレーブは、セキュアエンクレーブコンテナ536、ならびにその内側のコードおよびデータ、例えば、公開コードおよびデータ538ならびに秘密コードおよびデータ542を含む。
[0050]3つのプロセスが、例示的なプロセス500において組み合わされ、共有鍵SKをもたらす鍵交換プロセス、トラステッドプラットフォーム530上のエンクレーブのエンクレーブクライアント510へのアテステーションのためのアテステーションプロセス、およびセキュアな計算が行われる。第1のプロセスからの共有鍵SKは、セキュアな計算の入力および出力を通信するために使用される。鍵交換において、エンクレーブクライアントは、例えば、図6のディフィー・ヘルマン鍵交換(DKE)プロトコルについて以下に説明されるように、エンクレーブクライアントのプライベート鍵Aおよびジェネレータ関数gから、ボックス512内に格納されるgAをコンピューティングする。コンピューティングされたgAは、次いで、メッセージ520内でトラステッドプラットフォーム530に送信される。メッセージ520は、暗号化なしに、およびアテステーションが完了する前に、安全に送信され得る。セキュアエンクレーブコンテナ536の内側のソフトウェアは、同じジェネレータ関数gを使用してgBをコンピューティングするためにエンクレーブプライベートBを使用し得る。BおよびgBの両方は、ボックス540においてエンクレーブコンテナに格納され得る。
[0051]エンクレーブのアイデンティティを証明するために(どのコードがセキュアエンクレーブコンテナ536の内側で実行しているかに関して確証を提供するために)、アテステーションメッセージ522が、エンクレーブクライアント510に送信される。アテステーションメッセージは、図3のような完全性について署名された特別なメッセージであり得る。特別なメッセージは、エンクレーブに関するアイデンティティ情報を含み得る。図5の実施形態にあるようにDKEと組み合わされるとき、特別なメッセージは、鍵交換パラメーターも含み得る。図5の実施形態において、セキュアエンクレーブコンテナ536の、公開コードおよび公開データの初期状態538が、エンクレーブアイデンティティとして使用されるが、他のアイデンティティも可能である。初期状態538全体をアテステーションメッセージ内で送信する代わりに、初期状態のハッシュ、M=Hash(初期状態)が代わりに送信される。アテステーションメッセージ522は、メッセージコンテンツ(MおよびgB)、およびメッセージコンテンツの署名(SignAK(Hash(gB),M))を含む。メッセージコンテンツの署名は、例えば、セキュアエンクレーブコンテナ536の内側のソフトウェアが、エンクレーブをホストするトラステッドプラットフォーム530に、コンピューティングされたgBのハッシュおよびエンクレーブのアイデンティティを証明することを要求することによって、作成され得る。トラステッドプラットフォーム530は、SignAK(Hash(gB),M)をもたらすためにプラットフォームアテステーション鍵(AK)532を使用して署名を提供することによって、これを行い得る。本例では、エンクレーブアイデンティティは、初期状態538のハッシュMであるが、他のアイデンティティステートメントが可能である。このアテステーション署名SignAK(Hash(gB),M)は、値gBをエンクレーブアイデンティティMに結合し、また、gBおよびMの両方をトラステッドプラットフォーム530に結合する。エンクレーブクライアント510は、次いで、アテステーション署名およびエンクレーブアイデンティティを検証することによって、アテステーションメッセージを検証することができる。署名は、図3にあるように、アテステーション鍵AKに対応する公開鍵を使用して検証され得る。署名を検証することが、アテステーションメッセージ内のエンクレーブアイデンティティの完全性保証を提供し得る。エンクレーブアイデンティティは、アテステーションメッセージ内のアイデンティティ情報を、独立して知られているアイデンティティ値と比較することによって検証され得る。例えば、アテステーションメッセージ内のアイデンティティ情報が、エンクレーブの初期状態のハッシュである場合、エンクレーブクライアント510は、初期状態のハッシュを知り得るか、または既知の初期状態からそのようなハッシュをコンピューティングすることができる場合があり、この値は、次いで、アテステーションメッセージ内で提供されるアイデンティティ値と比較され得る。
[0052]共有鍵SKをもたらすために、エンクレーブクライアント510およびセキュアコンテナ536の内側のコードの両方が、共有鍵SKとしての役割を果たし得るgAB(A×Bの積に適用されるジェネレータ関数g)を生成することができる。共有鍵SKは、エンクレーブクライアント510とエンクレーブとの間の機密性のためにメッセージを暗号化するために、例えば、エンクレーブコンテナ536の内側のコードへ入力データを送信するため、およびエンクレーブコンテナ536の内側のコードから出力データを送信するために使用される。共有鍵は、エンクレーブクライアントまたはエンクレーブのいずれかが他方のプライベート鍵を知ることなく、ボックス540および514において通信チャネルの各側で独立してもたらされる。例えば、図5の実施形態において、秘密コードおよびデータは、それをメッセージ524内でトラステッドプラットフォーム530に送信する前に、以前に確立された共有鍵SKを用いて秘密コードおよびデータを暗号化し、EncSK(秘密コード/データ)をもたらすことによって、エンクレーブクライアント510によってセキュアに提供され得る。他の実施形態において、セキュアエンクレーブコンテナ536内で実行されるか、またはセキュアエンクレーブコンテナ536によって使用される秘密コードおよびデータ542は、他の場所から生じ得る。安全な計算は、計算結果544をもたらすために、秘密コードおよび/またはデータ542を使用してセキュアエンクレーブコンテナ536の内側で実施され得る。計算結果516は、次いで、それらをメッセージ526内でエンクレーブクライアントに送信する前に共有鍵SK(EncSK(results))を用いて結果を暗号化することによって、エンクレーブクライアント510へとセキュアに通信されて戻され得る。
[0053]上に説明される図5のプロセスは、エンクレーブクライアントが特定のアイデンティティの「本物の」エンクレーブと通信している、およびエンクレーブがエンクレーブプラットフォームによって保護されるという、エンクレーブクライアントに対する保証を提供する。これは、通信チャネルの反対側にあるエンティティに関してエンクレーブコンテナの内側のコードに対するいかなる保証も提供しない。代替的な実施形態において(描写されない)、エンクレーブクライアントに関するそのような保証は、エンクレーブ自体としてエンクレーブクライアントを実行することによって提供され得る。この代替的な実施形態において、エンクレーブクライアントは、信頼できるエンクレーブプラットフォームにgAのハッシュへの署名を求める場合があり、これは次いで、他のエンクレーブによって検証され得る。
[0054]アテステーションは、ローカルまたはリモートで行われ得る。図5では、エンクレーブクライアント510は、トラステッドプラットフォーム530として同じコンピューター上に存在する場合とそうでない場合とがあるため、その結果として、エンクレーブクライアント510とトラステッドプラットフォーム530との間の通信は、単一のコンピューター内で発生し得るか(例えば、同じコンピューター上の異なるプロセス間でデータバッファを引き渡すことによって)、またはエンクレーブクライアント510をトラステッドプラットフォーム530に接続するコンピューターネットワークを介して発生し得る。ローカルアテステーションは、エンクレーブクライアント510およびトラステッドプラットフォーム530が同じローカルコンピューター上でホストされるときに実施され得る。ローカルアテステーションの中間生成物または結果は、アテステーションレポートと呼ばれ、図5の例では、SignAK(Hash(gA),M)である。リモートアテステーションは、エンクレーブクライアント510およびトラステッドプラットフォーム530が異なるコンピューター上でホストされるときに発生し得る。リモートアテステーションの中間生成物または結果は、アテステーションクォートと呼ばれ、いくつかの場合において、これは、ローカルアテステーションレポートと非常に類似し得るか、または同一であり得る。他の場合において、アテステーションクォートは、クォートを提供するコンピューターまたはネイティブプラットフォームに関連する追加の信頼の中間生成物を含み得る。そのような追加の信頼の中間生成物は、TPMと関連付けられたTCGログなどのホスト健全性診断書を含み得る。エンクレーブのアテステーションは、エンクレーブのアイデンティティの任意の層上で実施され得る。エンクレーブは、ネスト化または階層アイデンティティを有し得、より高いレベルのアイデンティティへのアテステーションは、インスタンス化されたエンクレーブが、アイデンティティレベルが増大するにつれて潜在的なエンクレーブインスタンス化の漸進的により大きいグループのメンバーであるということを証明し得る。より高いレベルは、より低いレベルの潜在的なエンクレーブインスタンス化の上位集合に対応し得る。アイデンティティの例示的な階層は、最も低い最も具体的なレベルからより高いあまり具体的ではないレベルまで含み得、ExactHash、InstanceHash、ImageID、FamilyID、およびAuthorIDであり得る。
[0055]エンクレーブのアイデンティティは、エンクレーブのセキュアコンテナ内へロードされるバイナリファイル(エンクレーブバイナリ)から導出され得る。エンクレーブバイナリは、そのオーサーによって、オーサーのプライベート鍵を使用して署名され得る。ExactHashレベルアテステーションでは、アテステーションレポート(アテステーションレポートをもたらすためのハッシュ関数への入力)をコンピューティングするために使用される初期状態538は、トラステッドプラットフォーム530と関連付けられたバイナリを除き、セキュアコンテナ536内へロードされる全バイナリファイルのコンテンツ全体を含み得る。
[0056]InstanceHashアイデンティティにおけるアテステーションは、初期状態538のサブセットを含み得る。サブセットは、セキュアコンテナ536内へロードされるエンクレーブバイナリファイル(バイナリファイル)が、それらのエンクレーブバイナリファイルのオーサーによって当初に署名されたときに特定され得る。例えば、第1の(または一次)エンクレーブバイナリファイルは、第1のエンクレーブバイナリファイルが依存する他のエンクレーブバイナリファイルのアイデンティティのリストを含み得る。リストされる各アイデンティティについては、リストされる各バイナリファイルがInstanceHashアテステーションレポートをもたらすためにハッシュ関数によって測定されるか否かを示すためにフラグが第1のバイナリファイル内に含まれ得る。
[0057]より高いレベルのエンクレーブIDへのアテステーションは、任意のエンクレーブバイナリのコンテンツ全体をハッシュ関数にかけることを含まない場合がある。代わりに、IDのデータ構造のみが、ハッシュ関数にかけられ得る。例えば、エンクレーブバイナリファイルは、その特定のエンクレーブバイナリファイルに固有の画像ID(ImageID)、その特定のエンクレーブバイナリファイルを含み、かつ同じオーサーによって著作されるエンクレーブバイナリファイルのグループに固有のファミリーID(FamilyID)、および同じオーサーによってすべて著作されるエンクレーブバイナリファイルのファミリーのグループに固有のオーサーID(AuthorID)を示す、汎用一意識別子(UUID)などの、より高いレベルのエンクレーブ識別子のリストを含み得る。ImageID、FamilyID、およびAuthorIDは、バイナリが当初に署名されるときにエンクレーブバイナリのオーサーによって指定され得る。エンクレーブクライアントがエンクレーブバイナリにアクセスして、オーサーの公開鍵(またはオーサーと関連付けられた公開鍵)を使用してそれらのバイナリ上のオーサーの署名を検証することができる場合には、エンクレーブアイデンティティなりすましは防がれ得る。これは、オーサーによって指定される任意のより高いレベルのアイデンティティを含め、エンクレーブバイナリの完全性を、そのエンクレーブオーサーによって作成されていたと検証する。
[0058]図6は、例示的なディフィー・ヘルマン鍵交換(DKE)プロトコル600を描写する。DKEは、完全性保証のみを有する通信チャネルにわたって共有鍵Kを確立するための1つの例示的なプロセスであり、デジタル暗号法の分野で知られている共有鍵を作成するための他のプロセスが使用されてもよい。図6のDKE例において、秘密鍵Kは、アン610とベン650との間で公開(非セキュアの)通信媒体を介して決して明示的にKを通信することなくアン610とベン650との間で共有される。プロセスが開始する前に、1)大素数pおよび2)Zp内のジェネレータgが確立され得、アンおよびベンの両方に知られ得る。次いで、プロセスは、アンおよびベンの両方が1からpの間で乱数を選択することにより開始する。ボックス612において選択されるアンの乱数はAであり、ボックス652において選択されるベンの乱数はBである。アンは、ボックス614において自分の乱数を使用してgA mod pをコンピューティングし、ボックス616においてその量を伝送し、これはボックス656においてベンにより受信される。ベンは、ボックス654において自分の乱数を使用してgB mod pをコンピューティングし、これは、ボックス656においてアンに伝送され、ボックス618において受信される。アンは、ボックス620において、共有鍵Kを(gB mod p)A=gAB mod pとしてもたらすことができ、ベンは、ボックス660において、共有鍵Kを(gA mod p)B=gAB mod pとしてもたらすことができる。中間者攻撃を防ぐために、ボックス616および658からの非保護ネットワークを介したアンとベンとの間の通信は、例えば図3のものなどのプロセスを使用して作成されるメッセージ完全性保証を含み得る。
[0059]図7は、ソフトウェアアテステーションのための例示的な信頼チェーン700を描写する。ソフトウェアアテステーションにおける信頼チェーンは、図5のトラステッドプラットフォーム530などのトラステッドプラットフォームの製造業者によって所有される署名鍵に根差し得る。トラステッドプラットフォームは、セキュアプロセッサーまたはハードウェアセキュリティモジュール(HSM)などのハードウェアコンポーネントを含み得、したがって製造業者は、コンピューターハードウェアのプロバイダーであり得、また、トラステッドプラットフォームのためのソフトウェアを提供し得る。製造業者は、検証者702により信頼され得、検証者は、製造業者ルート鍵736の公開鍵PubRK732を知り得る。図5のエンクレーブクライアント510は、セキュアコンテナ708に関する確証を有することを望み得る検証者702の例である。製造業者は、認証局としての機能を果たし、アテステーション署名をもたらすために使用される固有のアテステーション鍵722と一緒に、製造業者が生産するトラステッドプラットフォームの各インスタンス、例えば各セキュアプロセッサーを提供し得る。製造業者はまた、各アテステーション鍵722のための承認証明書728を発行する。製造業者ルート鍵736は、承認証明書728に署名するために使用されるプライベート鍵PrivRK734を含む。承認証明書の署名は、例えば図3に示されるような、完全性保証を提供する。
[0060]承認証明書728は、アテステーション鍵722の公開鍵PubAK724を含む。承認証明書728は、アテステーション鍵722がソフトウェアアテステーションのために使用されることを示し得、検証者702へ通信され得る。検証者は、セキュアコンテナ708のアテステーションを検証することを望む任意のエンティティであり、例えば、検証者702は、セキュアな計算がセキュアコンテナ708の内側で行われることを望む図5のエンクレーブクライアント510であり得る。検証者702は、完全性および承認証明書の発信元を検証するために、PubRK732を使用して承認証明書を調査し得る。検証者はまた、承認証明書からPubAK724を抽出し得る。承認証明書は、アテステーション鍵722が、アテステーション署名をもたらすためだけに使用されること、およびアテステーション鍵722のプライベート鍵PrivAK726が、耐タンパー性ハードウェア730の記憶装置内など、トラステッドプラットフォームの一般的にアクセス可能なコンピューターメモリとは分離される記憶装置内に排他的に維持されることを要求し得る証明ポリシーと関連付けられ得る。耐タンパー性ハードウェアは、例えば、トラステッドプラットフォームモジュール(TPM)規格に準拠するハードウェアであり得る。
[0061]セキュアコンテナ708は、トラステッドプラットフォーム736上でインスタンス化され得る。セキュアコンテナ708のインスタンス化は、非セキュアの処理によるアクセスを制限されるセキュアコンテナのための隔離されたメモリ空間を規定することを含み得る。非セキュアの処理は、例えば、トラステッドプラットフォームの外側からではあるがトラステッドプラットフォームをホストするコンピューター上でのアクセス、またはトラステッドプラットフォームの内側の他のセキュアコンテナ内からのアクセスを含み得る。セキュアコンテナ708のインスタンス化はまた、公開コードおよびデータ、例えば、図5の初期状態535を、セキュアコンテナ内へロードすることを含み得る。
[0062]インスタンス化されたセキュアコンテナ708は、機密通信のための共有鍵を確立するために検証者702と鍵を交換することができる。鍵交換プロセスは、図5の鍵交換プロセスまたは図6のDKEプロセスであり得る。検証者は、例えば図6のボックス616にあるように、鍵交換メッセージ1 704をトラステッドプラットフォーム736に送信し、トラステッドプラットフォーム736は、例えば図6ボックス658にあるように、鍵交換メッセージ2 706を検証者702に返送する。
[0063]アテステーション署名710は、セキュアコンテナ708がインスタンス化され、鍵交換が完了した後に作成され得る。インスタンス化されたセキュアコンテナ708は、セキュアコンテナのすべてまたは部分に対して暗号学的ハッシュ関数を実行することによって測定され得る。これは、隔離されたメモリのコンテンツ、および、隔離されたメモリ、セキュアコンテナのインスタンス化の間に使用もしくは影響されるトラステッドプラットフォームと関連付けられた任意の他のメモリ、またはこれらの任意のサブセットもしくは部分内へロードされるバイナリファイルに対してハッシュ関数を実行することを含み得る。このハッシュ関数を実行する出力は、アテステーション署名710の部分である、測定値712である。鍵交換メッセージ704および706の暗号学的ハッシュも、データ714として描写されるアテステーション署名710と共に含まれ得る。測定値712およびデータ714は、アテステーションプライベート鍵PrivAK726を使用して署名され得る。アテステーション署名は、次いで、測定値712およびデータ714と一緒に検証者702に送信され得る。検証者は、承認証明書からのPubAK724を使用してアテステーション署名の完全性を検証することができ、PubAK724は、図7の例では、測定値712およびデータ714の完全性の検証も可能にする。検証者702は、測定値712を予測される結果(例えば、測定値712の同じハッシュをローカルで実施することによって決定される予測される結果)と比較することによってセキュアコンテナ708の完全性を検証することができ、また、(例えば、データ714のハッシュは、鍵交換メッセージ2 706に結び付けられるため)データ714を調査することによってアテステーション署名がこの特定の検証者702通信路インスタンスのために作成されたことを検証することができる。これらの検証動作および上の承認証明書の検証の後、検証者はこのとき、検証者が、確立された共有鍵を使用したセキュアコンテナ708との機密性および完全性の両方を有する通信を確立することができること、トラステッドプラットフォームハードウェアが、その製造業者に従って信頼され得ること、ならびにセキュアコンテナを作成するために使用されるトラステッドプラットフォームのソフトウェア状態が知られていることについて何らかの確証を有する。検証者702はこのとき、プライベートコードおよび/またはプライベートデータを使用してセキュアコンテナ708内でのセキュアな処理をリクエストする準備が整っている。
エンクレーブ抽象化プラットフォームおよびプリミティブ
[0064]図8は、例示的なローカルエンクレーブシステムのためのソフトウェアコンポーネントインターフェースのブロック図である。エンクレーブシステム800は、エンクレーブ814およびエンクレーブのクライアント816をホストするネイティブエンクレーブプラットフォーム812を有するコンピューター810を含む。ネイティブプラットフォーム812は、例えば、IntelのSGXまたはMicrosoftのVSMに基づいたハードウェアおよび/またはソフトウェアコンポーネントであり得る。エンクレーブ810は、図1のエンクレーブ176であり得る。エンクレーブのためのネイティブプロトコル844は、エンクレーブ814、クライアント816、およびネイティブプラットフォーム812の間の通信のために使用され得る。図8に描写されるように、ネイティブプロトコル844は、エンクレーブ814内のインターフェース820、ネイティブプラットフォーム内のインターフェース822および824、ならびにクライアント内のインターフェース826を含む。これらのインターフェースは、ソフトウェアコンポーネント内のAPIまたはABIであり得る。
[0065]これらのソフトウェアインターフェース820、822、824、および826の使用は、ソフトウェアコンポーネント間の実行制御転送を含み得る。制御転送は、制御が転送されているソフトウェアコンポーネント内のエントリーポイント(命令のアドレス)への呼び出しまたは飛び越し命令を実行することを含み得る。例えば、ネイティブプラットフォーム812がソフトウェアコンポーネントである場合、ネイティブプラットフォーム812からクライアント816への制御転送は、ネイティブプラットフォーム812内の呼び出しまたは飛び越し命令が、呼び出すまたは飛び越すべきクライアント816内のアドレスを特定して実行されるときにソフトウェアインターフェース826を介して発生し得る。クライアント816の内側の特定されたアドレスは、インターフェース816内の関数または方法のためのエントリーポイントであり得る。制御転送は、インターフェース820を介してネイティブプラットフォーム812からエンクレーブ814へ、インターフェース822を介してエンクレーブ814からネイティブプラットフォーム812へ、インターフェース824を介してクライアント816からネイティブプラットフォーム812へ、およびインターフェース826を介してネイティブプラットフォーム812からクライアント816へ、図8内の矢印で示される。ネイティブプロトコル844は、インターフェース820、822、824、および826を介した通信のパターンを含み得る。
[0066]いくつかの実施形態において、ネイティブプラットフォーム812は、例えばエンクレーブを管理するための特別なプロセッサー命令により、ハードウェアコンポーネントとして少なくとも部分的に実施され得る。そのような特別なハードウェア命令は、ネイティブプラットフォーム812ソフトウェアコンポーネントの部分として実行され得る。代替的な実施形態において、ネイティブプラットフォーム812の関数のうちの一部またはすべてのためにソフトウェアコンポーネントが存在しない場合がある。これらの代替的な実施形態において、ネイティブプラットフォームインターフェース822および824は、ソフトウェアエントリーポイントの代わりにハードウェア命令であってもよいため、ネイティブプラットフォーム812の関数は、エンクレーブ814もしくはクライアント816によって使用され得るか、または、呼び出しもしくは飛び越し命令を実行する代わりに、特別なハードウェア命令を代わりにそれぞれエンクレーブ814もしくはクライアント816内で実行することによって使用され得る。
[0067]いくつかの実施形態において、エンクレーブ814のクライアント816は、それ自体がエンクレーブであり得る。例えば、エンクレーブクライアント816は、インターフェース824を使用して、エンクレーブ814が作成されることをリクエストし得る。これらの実施形態において、ネイティブプラットフォーム812を介したエンクレーブ814とクライアント816との間の通信は、実際には、2つのエンクレーブ同士の通信である。クライアント816もエンクレーブであるとき、エンクレーブクライアント816はまた、インターフェース822を使用し、820に類似するインターフェース(描写されない)を露出し得る。
[0068]図9は、抽象化層を有する例示的なローカルエンクレーブシステムのためのソフトウェアコンポーネントインターフェースのブロック図である。エンクレーブシステム900は、ネイティブプロトコル944および抽象化プロトコル940、942間を翻訳するための抽象化プラットフォーム912を含む。ネイティブプラットフォーム918は、図8の抽象化プラットフォーム812に類似し得、インターフェース928および930は、図8のインターフェース820、822、824、および825の機能を組み合わせ得る。エンクレーブ抽象化プロトコル940は、エンクレーブ914のためのインターフェース920、922を含む一方、クライアント抽象化プロトコル942は、クライアント916のためのインターフェース924、926を含む。図8にあるように、コンピューター910上で実行するクライアント916は、インターフェース924を介してエンクレーブ914の作成をリクエストし得る。抽象化層912は、ネイティブプラットフォーム918と共にネイティブプロトコル944およびインターフェース928、930を使用してエンクレーブ914の作成を引き起こし得る。クライアント916およびエンクレーブ914は、ネイティブプラットフォーム918およびネイティブプロトコル944がIntel SGXまたはMicrosoft VSMなどの異なるエンクレーブアーキテクチャに基づくとき、抽象化プロトコル940および942を使用し得る。図8にあるように、エンクレーブ914のクライアント916は、それ自体がエンクレーブであり得、ネイティブプラットフォーム918は、ハードウェアおよび/またはソフトウェアコンポーネントを含み得る。
[0069]エンクレーブ914およびクライアント916は、直接的に通信しなくてもよく、代わりに抽象化プラットフォーム912を介してのみ通信し得る。直接通信は、例えばエンクレーブ914メモリの隔離に起因して、可能ではない、または望ましくない場合がある。エンクレーブメモリ隔離は、エンクレーブの隔離されたメモリからの読み込み、エンクレーブの隔離されたメモリへの書き込み、またはエンクレーブの隔離されたメモリ(内へのもしくはから外への飛び越し)実行を防ぎ得る。
[0070]エンクレーブ914は、コンピューター910のエンクレーブセキュアコンテナの内側に位置する命令を含み得る。クライアント916は、コンピューター910のメモリアドレス空間内に位置するが、エンクレーブ914のセキュアコンテナの外側に位置する命令を含み得る。抽象化プラットフォーム912は、エンクレーブ914のセキュアコンテナの内側または外側にある命令としてなど、様々なやり方で実施され得、また、ハイパーコール内から実行される命令を含み得る。抽象化プラットフォーム912がエンクレーブ914のセキュアコンテナ内に少なくとも部分的に含まれる場合、セキュアコンテナの内側の抽象化プラットフォームコードは、エンクレーブ914のコードの残りの部分とは別個に著作され得、公開API/ABIを介して他のエンクレーブコードと相互作用するだけであり得る。そのような抽象化プラットフォームコードは、エンクレーブセキュアコンテナの内側のコードの残りの部分に静的にリンクされ得るか、または動的にリンクされ得る。静的にリンクされた抽象化プラットフォームコードは、抽象化プラットフォームと関連付けられ、エンクレーブ914により特有であるコードと一緒に、エンクレーブ914がインスタンス化され得るバイナリ画像内に含まれる(静的にリンクされる)オブジェクトコードであり得る。動的にリンクされた抽象化プラットフォームの場合、エンクレーブ914により特有であるエンクレーブコード、および抽象化プラットフォームとより一般的に関連付けられたコードは、別個のバイナリ画像から供給され得る。動的にリンクされた例については、図14を参照されたい。
[0071]図10は、抽象化層を有する例示的なリモートエンクレーブシステムのためのソフトウェアコンポーネントインターフェースのブロック図である。リモートエンクレーブシステム1000は、コンピューター1010上のエンクレーブ1014、および別個のコンピューター1050上のエンクレーブ1014のクライアント1056を含む。クライアントスタブ1016および抽象化リモート処理プラットフォーム1052の組合せは、エンクレーブ1014とクライアント1056との間の相互作用を促進し得る。コンピューター1010内の多くの要素は、図9のコンピューター910の同一名の要素と同一であり得るか、または類似し得る。特に、抽象化プラットフォーム1012、プロトコル1040、1042、1044、およびネイティブプラットフォーム1018は、それぞれ対応する要素912、940、942、944、および918と類似し得るか、または同一であり得る。
[0072]クライアントスタブ1016は、ネットワーク通信1080を介して抽象化リモート処理プラットフォーム1052と通信し得る。リモートクライアントプロトコル1082、およびインターフェース1064、1066は、クライアント抽象化プロトコル1042、およびインターフェース1024、1026と類似し得る。しかしながら、リモートクライアントプロトコルは、リモート処理のための追加の機能性を含み得る。例えば、エンクレーブの作成をリクエストするためのCreateEnclaveなどのインターフェース1064内の方法は、追加的に、エンクレーブが作成されることがリクエストされる場合に、コンピューター1010などのエンクレーブホストコンピューターを特定する能力を含み得る。リモートクライアントプロトコルを介してクライアント1056に提供されるエンクレーブ1014のアテステーションクォートは、アテステーションレポートの代わりに、またはそれに加えて提供され得る。クライアント1056を有するコンピューター1050は、ネイティブエンクレーブプラットフォーム1058を含む場合とそうでない場合とがある。ネイティブプラットフォーム1058が存在する場合、ネイティブプラットフォーム1058は、サンプル・エンクレーブ・アーキテクチャ・ネイティブ・プラットフォーム1018に準拠する場合とそうでない場合とがあり、故に、ネイティブプロトコル1044およびリモートネイティブプロトコル1084は、同じではない場合がある。
[0073]代替的な実施形態において(描写されない)、クライアントスタブ1016は存在しない場合があり、抽象化プラットフォーム1012は、ネットワークを介して抽象化リモート処理プラットフォーム1052と直接的に通信し得る。
[0074]図9および図10の940、942、1040、1042、1082などのエンクレーブ抽象化プロトコルは、Intel SGXおよびMicrosoft VSMなどの複数のネイティブプラットフォーム上で構築されるエンクレーブを管理および使用するために様々なインターフェース方法またはエントリーポイントを含み得る。これらの方法は、複数のネイティブプラットフォーム上で実施され得るエンクレーブプリミティブを提供し得、故にネイティブプラットフォームの「抽象化」を提供する。ここに開示されるエンクレーブプリミティブは、エンクレーブライフサイクル管理、アテステーション、データ密封、制御転送、単調カウンター、および信頼できる時刻を含む。
[0075]エンクレーブライフサイクル管理のためのプリミティブは、エンクレーブ914などのエンクレーブのインスタンス化または終了を引き起こすための方法を含み得る。ライフサイクル管理プリミティブは、クライアント抽象化プロトコル942の一部であり得、およびより具体的には、クライアント916による使用のためのインターフェース924の部分として抽象化プラットフォーム912によって実施され得る。
[0076]エンクレーブをインスタンス化または作成するための方法は、セキュアエンクレーブコンテナの隔離されたメモリ内へロードされるべきコードおよび/またはデータの実行可能な画像を特定することを含み得る。このコードは、それがエンクレーブコンテナ内へロードされる前または後に、インスタンス化されたエンクレーブのアテステーションのために使用される(図5に関して上に説明されるように)初期状態の部分になり得る。例えば、エンクレーブの実行可能な画像(エンクレーブバイナリ)は、実行可能な画像を含むメモリ内のバッファにポインターを提供することによって、エンクレーブクライアントにより特定され得る。代替的に、エンクレーブ画像は、エンクレーブバイナリを含むファイルシステム内のファイルを示すことによって特定され得る。いくつかの実施形態において、特定されたエンクレーブ画像は、暗号化され得、他の実施形態において、エンクレーブは、暗号化されない場合があり、他の実施形態において、エンクレーブは、部分的に暗号化され得る。アテステーションのためのエンクレーブバイナリの測定は、暗号化された実行可能な画像に対して、または復号の後に発生し得る。
[0077]エンクレーブ内へ最初にロードされるべきコードおよび/またはデータは、エンクレーブ一次画像を含むファイルを特定することによって示され得る。このコードおよび/またはデータに加えて、エンクレーブ一次画像は、エンクレーブの所望のサイズ(エンクレーブコンテナの内側で必要とされるメモリの量)、ファイル内のコード内でのエントリーポイントの場所、および依存画像ファイルのリストなどの追加のメタデータを含み得る。依存画像ファイルは、一次画像ファイル内のコードおよびデータと一緒にエンクレーブ内へ同様にロードされ得る他の(非一次)画像ファイルである。依存画像ファイルは、それら自体がさらなる依存画像ファイルのリストを含み得る。図9のローカルエンクレーブシステムの場合、一次画像および依存画像は、ローカルでアクセス可能なファイルシステムを介するなど、任意のアクセス可能な記憶デバイス内にファイルされ得る。図10のリモートエンクレーブシステムの場合、一次画像ファイルは、コンピューター1010またはコンピューター1050のいずれかにアクセス可能な任意の記憶デバイス内にあり得る。クライアント1056が、コンピューター1050上に位置する一次画像を使用してコンピューター1010上でのエンクレーブの作成をリクエストする場合、抽象化リモート処理プラットフォームおよびクライアントスタブ1016は、特定された一次画像ファイルをコンピューター1010にコピーするために連携し得る。
[0078]CreateEnclaveは、エンクレーブをインスタンス化するための例示的な方法である。CreateEnclave方法は、疑似コードを用いて説明され得る。
HANDLE
CreateEnclave(
_In_ PCWSTR enclavePath,
_In_ DWORD flEnclaveType,
_In_ DWORD dwFlags,
_In_reads_bytes_(dwInfoLength)
PCVOID enclaveInformation,
_In_ DWORD dwInfoLength,
_Out_opt_ PDWORD enclaveError
)
[0079]本明細書内の方法を説明するために使用される疑似コードは、APIインターフェースを規定するためのいくつかの疑似コード変換を使用し得る。例えば、上のenclavePathなどの関数パラメーターは、パラメーターが入力または出力パラメーターであることをそれぞれ示すために「_In_」または「_Out_」が施され得る。「_Out_opt_」は、任意選択の出力パラメーターを示し得る。すべて大文字の用語は、データタイプを示し得る。HANDLEは、32ビットの数字など、何かを間接的に指すために使用される数字であり得る。例えば、上のCreateEnclave方法は、CreateEnclaveの呼び出し元にHANDLEを返し、そのHANDLEは、作成されたエンクレーブのハンドルであり得、PCWSTRは、特定のタイプの文字列へのポインターであり得、DWORDは、未署名の32ビット量であり得、PCVOIDは、未特定のタイプのデータへのポインターであり得、BOOLは、バイナリ値であり得る。
[0080]CreateEnclaveは、クライアント916などのクライアントが、エンクレーブを作成し、エンクレーブ内で一次画像をロードすることを可能にし得る。この画像内の任意のエンクレーブ構成情報は、インスタンス化されたエンクレーブと関連付けられ得る。CreateEnclaveは、以下のパラメーターを含み得る。
lpEoclaveName:エンクレーブ一次画像へのパスを特定し得、これは、実装形態において、オープンされたファイルへのハンドル、Uniform Resource Identifier(URI)、または外部ルックアップ内で使用される識別子など、エンクレーブ一次画像のコードおよび/またはデータを識別するための何らかの他のタイプの識別子であり得る。例えば、グローバル一意識別子(GUTD)が、一次画像のデータベース内への鍵として使用され得る。他の実装形態において、このパラメーターは、エンクレーブ一次画像を含むメモリ領域を識別し得る。
flEnclaveType:作成するべきエンクレーブのタイプを特定し得る(エンクレーブ画像が複数のタイプをサポートする場合)。バイナリが1つのエンクレーブのみをサポートするか、または開発者がデフォルトを明示的に特定している場合にはDEFAULTに設定され得る。dwFlags:エンクレーブを作成してエンクレーブ一次画像をロードするときにとられるべき1つまたは複数の既定の行為を特定し得る。
enclaveInformation:エンクレーブのランタイム構成のための任意選択の入力パラメーターであり得る。
lpEoclaveError:アーキテクチャ特有のエラーコードを返すために任意選択のパラメーターを特定し得る。
[0081]正常に完了すると、CreateEnclaveは、エンクレーブにハンドルを返し得る。エラー時には、NULLが返され得る。他の識別子(GUID、URIなど)も、本開示の範囲から逸脱することなく返され得る。簡略性のため、本明細書は、ハンドルを使用してAPIを説明するものとする。エンクレーブ作成は、例えば、エンクレーブメモリの欠如、抽象化プラットフォームもしくはネイティブプラットフォーム内の特定されたエンクレーブタイプに対するサポートの欠如に起因して失敗し得るか、または、作成は、特定されたタイプのエンクレーブがシステム上で実行することを防ぐ明示的な構成ポリシーに起因して失敗し得る。
[0082]CreateEnclaveおよび以下に説明される他のAPI方法の実装形態は、説明される方法パラメーターのうちの1つまたは複数を除外し得る。例えば、CreateEnclaveに関して、lpEnclaveName、flEnclaveType、dwFlags、およびenclaveInformationは、その特定のAPIのための特定の既定の値を使用して、除外され得る。lpEnclaveError論もまた、APIから除外され得、API呼び出し内のエラーをチェックするための代替的な方法が、任意選択的に実施され得る。
[0083]CreateEnclaveは、エンクレーブ一次画像内で特定されるようなすべての依存モジュールをロードすることを担い得る。エンクレーブ一次画像は、一次画像が依存する他のバイナリ画像ファイルを特定するポータブル実行(PE)ファイルであり得る。CreateEnclaveはまた、アテステーションのための測定を仕上げること、トランスポート層セキュリティ(TLS)ならびに/または他の鍵合意および通信プロトコルのための構造を割り当てることなど、ネイティブプラットフォーム特有の初期化を実施し得る。エンクレーブ抽象化プロトコルインターフェース920、922(例えば、データ密封およびアテステーションのための方法を含む)は、エンクレーブ初期化が完了した後に動作可能であり得る。
[0084]TerminateEnclaveは、エンクレーブを終了するための例示的な方法である。
VOID
TerminateEnclave(
_In_ HANDLE hEnclave
)
[0085]TerminateEnclaveは、エンクレーブを破壊するために使用され得る。実装形態において、エンクレーブを破壊することは、強制的にすべてのエンクレーブスレッドをホストに返すかもしくは終了すること、および/またはエンクレーブと関連付けられたメモリを解放することを含み得る。実行中のエンクレーブ上でTerminateEnclaveを呼び出すことは、実行中のエンクレーブを終了して、エンクレーブと関連付けられたすべてのリソースを解放し得る。
[0086]エンクレーブ抽象化プラットフォーム912は、例えば、エンクレーブとそのクライアントとの間で制御を転送するために使用され得る実行制御転送プリミティブを含み得る。実行制御転送プリミティブは、他のコンポーネント内のエントリーポイントにおいてコードの実行を開始することによってエンクレーブ914とクライアント916との間の通信を可能にし得る。実行制御転送プリミティブは、パラメーターが制御転送リクエストと関連付けられることを可能にすることによってデータをエンクレーブ内へ/から外へ引き渡すことを可能にし、パラメーターは、個々のデータアイテムを特定し得る(パラメーター自体が通信される)か、またはパラメーターは、メモリ領域へのポインターであり得る(パラメーターによってポイントされるバッファが通信される)。これらのプリミティブは、エンクレーブコンテナに対するセキュリティ制限に起因するエンクレーブ914とクライアント916との間の直接的な呼び出しまたは飛び越しへの制約にもかかわらず、制御転送を可能にし得る。
[0087]エンクレーブへのコールインの場合、インターフェース924は、クライアント916がインターフェース920を介してエンクレーブ914へコールインすることを可能にする機序を含み得る。例えば、インターフェース924は、GetProcAddressおよびCallEnclave方法を含み得る。
typedef PVOID(*ENCPROC)(PVOID);
ENCPROC
GetProcAddress(
_In_ HMODULE hEnclave,
_In_ LPCTSTR lpProcName
)
BOOL
CallEnclaveIn(
_In_ ENCPROC pCallin,
_In_ PVOID pParameter,
_Out_ PVOID pReturn
)
[0088]クライアント916などのエンクレーブクライアントは、GetProcAddress()によって返される関数ポインターを使用して、エンクレーブ914などのエンクレーブへコールインすることができる。lpProcNameパラメーターは、エンクレーブ一次画像内にエクスポートされる関数と一致し得る。例えば、
//エンクレーブのためのCallin関数を呼び出す。
ENCPROC pCallin = (ENCPROC) GetProcAddress(hEnclave,”CallinExample”);
PVOID pParameter;//メモリへのポインター
if(NULL !=pCallin)
{
CallEnclaveIn(pCallin,pParameter);
}
[0089]GetProcAddressの他の実施形態において、lpProcNameは、エンクレーブ画像からエクスポートされるエントリーポイントの列挙からの選択など、数字などの特定のエクスポートされた関数の別の識別子、または関数に対応する他の非テキスト識別子であり得る。CallEnclaveInの他の実施形態は、追加的に、コールインされるべきエンクレーブを特定する入力パラメーター、例えば、ハンドルを返されたCreateEnclaveをとり得る。
[0090]エンクレーブへコールインするとき、クライアントプロセス内のスレッドは、保留され得、エンクレーブスレッド(別個のスレッドID付き)は、コールインリクエストをサービスするために使用され得る。エンクレーブスレッド上で実行するエンクレーブコードは、このとき、エンクレーブへのコールインの前に以前はエンクレーブクライアントに利用可能であったメモリへのアクセスを有し得る。例えば、クライアントは、CallEnclaveIn抽象化方法を呼び出す前にpParameterによってポイントされるバッファ内へデータを入れ得、その後エンクレーブは、コールインリクエストをサービスしながら、pParameterによってポイントされるバッファへのアクセスを有し得る。コールアウトの際、元の(クライアント)呼び出しスレッドが、コールアウトをサービスするために使用され得る。リエントラント性がサポートされ得る(例えば、ホスト内のコールアウトは、再びエンクレーブへコールインすることができる)。
[0091]エンクレーブのコールアウトの場合、インターフェース922は、エンクレーブ914がエンクレーブクライアント916へコールアウトすることを可能にする上のCallEnclaveIn方法に関連した方法を含み得る。例えば、エンクレーブ914は、特定のタイプ、例えばENCPROC関数タイプ、のホストプロセス内で任意の関数をコールアウトし得る。ENCPROC関数タイプの関数ポインターは、エンクレーブへのコールインパラメーターを使用して引き渡され得る。
BOOL
CallEnclaveOut(
_In_ ENCPROC pCallout,
_In_ PVOID pParameter,
_Out_ PVOID pReturn
)
//ホストプロセス内の関数へコールアウトする
ENCPROC pCallout=(ENCPROC)0xF00;//ホスト内の何らかの関数へのアドレス
PVOID pParameter=//メモリへのポインター
CallEnclaveOut(pCallout,pSharedMemory);
インターフェース920は、上の「CallinExample」関数として登録されたエントリーポイントを含み得、インターフェース926は、上の「Callout」関数として登録されたエントリーポイントを含み得る。例えば、エンクレーブ一次画像がポータブル実行可能な(PE)画像形式にある場合、画像内の関数エントリーポイントは、「エクスポート」エントリーポイントとしてリストされ得、各そのようなエクスポートされたエントリーポイントは、そのエンクレーブPE画像内のエントリーポイントを識別および区別するために「CallinExample」などのテキスト名を含み得、他の実装形態において、関数エントリーポイントは、関数がエンクレーブのためのエントリーポイントであり得ることを示す1ビットなど、追加のメタデータでマークされ得る。エンクレーブのコールアウトのための上の例において、コールアウト関数のアドレスは、0xF00として得られ、単に例にすぎない。コールアウト関数の実際のアドレスは、様々なやり方で決定され得る。例えば、クライアントの内側のコールアウト関数アドレスは、コールイン関数のためのパラメーターとしてエンクレーブ内へ引き渡され得る。別の例において、コールアウト関数のアドレスは、RegisterCallOutなどの関数を使用してクライアントによって登録され得る。
BOOL RegisterCallOut(
_In_ ENCPROC pCallout,
_In_ LPCTSTR lpProcName)
エンクレーブの内側のコードは、GetCallOutなどの補関数を呼び出すことによってコールアウト関数のアドレスを獲得し得る。
BOOL GetCallOut(
_Out_ ENCPROC *pCallout,
_In_ LPCTSTR lpProcName)
[0092]他の実施形態において、CallEnclavelnおよびCallEnclaveOut方法は、実際には同じ方法であり得る。例えば、単一のCallEnclave方法が、エンクレーブへコールインするためおよびエンクレーブからコールアウトするために使用され得る。エンクレーブクライアント916もまたエンクレーブである状況において、クライアント916へのエンクレーブ914のコールアウトは、エンクレーブへのコールインでもある。
[0093]抽象化プラットフォーム912は、データをエンクレーブへ密封するためのプリミティブを提供し得る。例えば、インターフェース922は、データをエンクレーブアイデンティティへ密封および開封することなど、エンクレーブ914へのサービスを提供し得る。上に説明されるように、エンクレーブは、複数のネスト化アイデンティティを有し得、データは、任意のそのようなアイデンティティへと密封され得る。データが、潜在的なエンクレーブインスタンス化のセットに対応するアイデンティティへ密封されるとき、密封データは、エンクレーブインスタンス化のその対応するセットのいずれかによって開封され得る。例えば、
struct SEALING POLICY
{
ENCLAVE_ID_TYPE enclaveIdType;
};
[0094]enclaveIdTypeの各値については、エンクレーブは、マッピングIDへと密封する。潜在的なエンクレーブアイデンティティタイプ(およびenclaveIdTypeの値)としては、以下が挙げられる。
ENCLAVE_EXACTHASH
ENCLAVE_INSTANCEHASH: //SGXの場合はMRENCLAVE、VSMの場合はIMAGE HASHを使用した密封
ENCLAVE_IMAGEIDS: //SGXではサポートされず、VSMの場合IMAGE IDSを使用する
ENCLAVE_FAMILYID: //SGXの場合はPRODUCTID、VSMの場合はFAMILY IDを使用する
ENCLAVE_AUTHORID: //SGXの場合はMRSIGNER、VSMの場合はAUTHOR IDを使用する
[0095]プラットフォームはまた、追加のデバッグ構成(著作されたおよびランタイム)を密封ポリシーに適用し得る。異なるデバッグポリシーでは、異なる密封鍵が使用され得る。例えば、デバッグおよびリリース構成は、異なる密封鍵を使用し得る。
DWORD
Enclave Seal(
_In_ SEALING_POLICY sealingPolicy,
_In_reads_bytes_opt_(dwPlaintextSize)LPCVOID pPlaintext,
_In_ DWORD dwPlaintextSize,
_In_reads_bytes_opt_(dwAuthdataSize)LPCVOID pAuthdata,
_In_ DWORD dwAuthdataSize,
_Out_writes_bytes_to_(dwSealedtextSize)LPVOID pSealedtext,
_Inout_ DWORD *dwSealedtextSize
)
DWORD
EnclaveUnseal(
_In_reads_bytes_opt_(dwSealedtextSize)LPCVOID pSealedtext,
_In_ DWORD dwSealedtextSize,
_In_reads_bytes_opt_(dwAuthdataSize)LPCVOID pAuthdata,
_In_ DWORD dwAuthdataSize,
_Out_writes_bytes_to_(dwPlaintextSize)LPCVOID pPlaintext,
_Inout_ DWORD *dwPlaintextSize
)
[0096]抽象化プラットフォーム912は、アテステーションレポートおよびクォートをもたらすため、ならびにレポートおよびクォートを検証するためなど、アテステーションのためのプリミティブを提供し得る。例えば、
DWORD
CreateReport(
_In_reads_bytes_opt_(dwTargetInfoSize)PCVOID pTargetlnfo,
_In_ DWORD dwTargetInfoSize,
_In_reads_bytes_opt_(dwAuthData)PCVOID pAuthData,
_In_ DWORD dwAuthData,
_Out_writes_bytes_opt_(*pReportSize)PVOID pReport,
_Inout_ PDWORD pReportSize,
_Out_opt_ PDWORD IpEnclaveError
)
DWORD
VerifyReport(
_In_reads_bytes_(dwReportSize)PCVOID pReport,
_In_ DWORD dwReportSize,
_Out_opt_ LPDWORD lpEnclaveError
)
[0097]VerifyReport()は、レポートの完全性、およびレポートが同じマシン上のエンクレーブによって生成されたことを確認するためにエンクレーブによって使用され得る。
DWORD CreateQuote(
_In_ GUID quoteType,
_In_ DWORD authDataSize,
_In_reads_bytes_opt_(authDataSize)const BYTE* authData,
_Out_ DWORD* quoteSize,
_Outptr_result_bytebuffer_opt_(*quoteSize)BYTE** quote
)
[0098]CreateQuoteにおいて、quoteTypeは、特定のクォートを生成するための信頼の源であり得るクォートプロバイダーへマッピングし得る。CreateQuoteにおいて、authDataは、CreateQuoteの呼び出し元によって作成される、およびCreateQuoteの呼び出し元によって規定される形式にあるデータへのポインターであり得る。authDataは、抽象化プラットフォーム912によって理解される必要がないことに留意されたい。authDataは、結果として生じるクォート内へ詰め込まれ得る。クォートプロバイダーは、これをサポートすることが期待され得る。
DWORD VerifyQuote(
_In_ DWORD quoteSize,
_In_reads_bytes_(quoteSize)const BYTE* quote,
_Out_ DWORD* reportSize,
_Outptr_result_bytebuffer_all_(*reportSize)BYTE** report
)
[0099]上に説明されるエンクレーブプリミティブに加えて、エンクレーブ抽象化プラットフォームは、メモリ管理(例えば、エンクレーブに限定されているメモリ、エンクレーブとそのクライアントとの間で共有されるメモリなどのメモリを割り当てる、および解放するため)、例外処理(例えば、エンクレーブコードを実行している間に発生するエラーまたは例外を処理するため)、スレッド同期、および暗号関数(例えば、暗号化、ハッシュ関数、および署名)を提供し得る。
[0100]上に説明される技術は、以下に説明されるように、1つまたは複数のコンピューティングデバイスまたは環境上で実施され得る。図11は、本明細書に説明される技術の一部が具現化され得る、例えば、信頼できるハードウェア172、トラステッドプラットフォーム736、またはコンピューター810、910、1010、および1050のうちの1つまたは複数を具現化し得る例示的な汎用コンピューティング環境を描写する。コンピューティングシステム環境1102は、好適なコンピューティング環境の一例にすぎず、本開示される主題の用途または機能性の範囲に関していかなる限定も提示することは意図されない。コンピューティング環境1102は、例示的な動作環境1102内に例証されるコンポーネントの任意の1つまたは組合せに関して何らかの依存関係または要件を有すると解釈されないものとする。いくつかの実施形態において、様々な描写されたコンピューティング要素は、本開示の特定の態様を例示化するように構成される回路を含み得る。例えば、本開示で使用される回路という用語は、ファームウェアまたはスイッチによって関数を実施するように構成される特殊ハードウェアコンポーネントを含み得る。他の例示的な実施形態において、回路という用語は、関数を実施するように動作可能な論理を具現化するソフトウェア命令によって構成される汎用処理ユニット、メモリなどを含み得る。回路がハードウェアおよびソフトウェアの組合せを含む例示的な実施形態において、実装者は、論理を具現化するソースコードを書くことができ、ソースコードは、汎用処理ユニットによって処理され得る機械可読コードにコンパイルされ得る。当業者は、先行技術が、ハードウェア、ソフトウェア、またはハードウェア/ソフトウェアの組合せの間にはほんの少しの差しかないところまで発展したということを理解し得るため、特定の関数を達成するためのハードウェア対ソフトウェアの選択は、実装者に委ねられたデザイン選択である。より詳細には、当業者は、ソフトウェアプロセスが等価のハードウェア構造に転換され得、ハードウェア構造は、それ自体が等価のソフトウェアプロセスに転換され得るということを理解し得る。したがって、ハードウェア実装形態対ソフトウェア実装形態の選択は、実装者に委ねられたデザイン選択のうちの1つである。
[0101]モバイルデバイスもしくはスマートフォン、タブレット、ラップトップ、デスクトップコンピューター、またはネットワーク化デバイス、クラウドコンピューティングリソースなどの集合のいずれかを含み得るコンピューター1102は、典型的には、様々なコンピューター可読媒体を含む。コンピューター可読媒体は、コンピューター1102によってアクセスされ得、かつ揮発性および不揮発性媒体、可換型および非可換型媒体の両方を含む、任意の利用可能な媒体であり得る。システムメモリ1122は、リードオンリメモリ(ROM)1123およびランダムアクセスメモリ(RAM)1160などの揮発性および/または不揮発性メモリの形態でコンピューター可読記憶媒体を含む。起動中などに、コンピューター1102内の要素間で情報を転送するのに役立つ基本ルーチンを含む基本入力/出力システム1124(BIOS)は、典型的には、ROM1123に格納される。RAM1160は、典型的には、直ちにアクセス可能である、および/または処理ユニット1159上で現在動作されているデータおよび/またはプログラムモジュールを含む。例として、また限定ではなく、図11は、ハイパーバイザー1130、オペレーティングシステム(OS)1125、アプリケーションプログラム1126、エンクレーブクライアント1165を含む他のプログラムモジュール1127、およびエンクレーブ1128を例証する。
[0102]コンピューター1102はまた、他の可換型/非可換型の揮発性/不揮発性コンピューター記憶媒体を含み得る。単に例として、図11は、非可換型の不揮発性磁気媒体から読み込むまたはそこへ書き込むハードディスクドライブ1138、可換型の不揮発性磁気ディスク1154から読み込むまたはそこへ書き込む磁気ディスクドライブ1139、およびCD ROMまたは他の光学媒体などの可換型の不揮発性光学ディスク1153から読み込むまたはそこへ書き込む光学ディスクドライブ1104を例証する。例示的な動作環境において使用され得る他の可換型/非可換型の揮発性/不揮発性コンピューター記憶媒体としては、限定されるものではないが、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、固体RAM、固体ROM、および同様のものが挙げられる。ハードディスクドライブ1138は、典型的には、インターフェース1134などの非可換型メモリインターフェースを通じてシステムバス1121に接続され、磁気ディスクドライブ1139および光学ディスクドライブ1104は、典型的には、インターフェース1135または1136などの可換型メモリインターフェースによってシステムバス1121に接続される。
[0103]上で論じられかつ図11に例証されるドライブおよびそれらの関連コンピューター記憶媒体は、コンピューター可読命令、データ構造、プログラムモジュール、およびコンピューター1102の他のデータの記憶装置を提供する。図11では、例えば、ハードディスクドライブ1138は、オペレーティングシステム1158、アプリケーションプログラム1157、エンクレーブクライアントアプリケーションおよびエンクレーブバイナリファイルなどの他のプログラムモジュール1156、ならびにプログラムデータ1155を格納するものとして例証される。これらのコンポーネントは、オペレーティングシステム1125、アプリケーションプログラム1126、他のプログラムモジュール1127、およびプログラムデータ1128と同じであるか、またはそれらと異なるかのいずれかであり得ることに留意されたい。オペレーティングシステム1158、アプリケーションプログラム1157、他のプログラムモジュール1156、およびプログラムデータ1155は、少なくともそれらが異なるコピーであることを例証するためにここでは異なる数字が付与される。ユーザーは、一般にはマウス、トラックボール、またはタッチパッドと称されるキーボード1151およびポインティングデバイス1152などの入力デバイスを通じて、コマンドおよび情報をコンピューター1102へ入力し得る。他の入力デバイス(図示されない)は、マイク、ジョイスティック、ゲームパッド、パラボラアンテナ、スキャナー、網膜スキャナー、または同様のものを含み得る。これらおよび他の入力デバイスは、多くの場合、システムバス1121に結合されるユーザー入力インターフェース1136を通じて処理ユニット1159に接続されるが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス(USB)などの他のインターフェースおよびバス構造によって接続されてもよい。モニター1142または他のタイプのディスプレイデバイスもまた、ビデオインターフェース1132などのインターフェースを介してシステムバス1121に接続される。モニターに加えて、コンピューターはまた、出力周辺インターフェース1133を通じて接続され得るスピーカー1144およびプリンター1143などの他の周辺出力デバイスを含み得る。
[0104]コンピューター1102は、リモートコンピューター1146などの1つまたは複数のリモートコンピューターへの論理接続を使用してネットワーク化環境内で動作し得る。リモートコンピューター1146は、パーソナルコンピューター、サーバー、ルーター、ネットワークPC、ピアデバイス、または他の共通ネットワークノードであり得、典型的には、コンピューター1102に関連して上に説明される要素の多くまたはすべてを含むが、メモリ記憶デバイス1147のみが図11には例証されている。図11に描写される論理接続は、ローカルエリアネットワーク(LAN)1145および広域ネットワーク(WAN)1149を含むが、他のネットワークも含み得る。そのようなネットワーキング環境は、オフィス、企業全体のコンピューターネットワーク、イントラネット、インターネット、およびクラウドコンピューティングリソースでは一般的である。
[0105]LANネットワークキング環境が使用されるとき、コンピューター1102は、ネットワークインターフェースまたはアダプター1137を通じてLAN1145に接続される。WANネットワーキング環境が使用されるとき、コンピューター1102は、典型的には、モデム1105、または、インターネットなどの、WAN1149を介した通信を確立するための他の手段を含む。内部または外部であり得るモデム1105は、ユーザー入力インターフェース1136または他の適切な機序を介してシステムバス1121に接続され得る。ネットワーク化環境において、コンピューター1102に関して描写されるプログラムモジュールまたはその部分は、リモートメモリ記憶デバイス内に格納され得る。例として、また限定ではなく、図11は、リモートアプリケーションプログラム1148をメモリデバイス1147上に存在するものとして例証する。示されるネットワーク接続は例であり、コンピューター同士の通信リンクを確立する他の手段が使用され得ることを理解されたい。
[0106]図12は、ネイティブエンクレーブプラットフォームを抽象化する方法1200の例示的なフローチャートを描写する。図9の912などの抽象化プラットフォームは、ボックス1202においてエンクレーブプラットフォームのためのリクエストを受信し得る。リクエストは、クライアント914などのエンクレーブクライアント、またはエンクレーブ916などのエンクレーブからのものであり得る。
[0107]エンクレーブからのリクエストは、抽象化プラットフォームプリミティブを実施するためのリクエストであり得、例えば、エンクレーブのアテステーションレポートまたはクォートを作成するためのリクエスト、エンクレーブへとデータを密封するためのリクエスト、エンクレーブのクライアント内に関数を呼び出す(クライアントへコールアウトする)ためのリクエスト、単調カウンターを読み込む(単調カウンターの現在の値を提供する)ためのリクエスト、信頼できる時刻測定値を提供するためのリクエスト、およびエンクレーブとそのクライアントとの間で共有され得るメモリを割り当てるためのリクエスト(例えば、エンクレーブへのコールインまたはエンクレーブからのコールアウトの際に、共有メモリへのポインターがパラメーターとして引き渡されることを可能にするため)を含み得る。いくつかの実施形態において、エンクレーブクライアントの仮想メモリ空間全体は、共有メモリを割り当てるためのリクエストがメモリをエンクレーブのクライアントに割り当てるためのリクエストとして実施され得るように、エンクレーブと共有され得る(およびそこからアクセス可能である)。いくつかの実施形態において、共有メモリを割り当てる方法は、エンクレーブおよびそのクライアントの両方に利用可能である。
[0108]エンクレーブクライアントからのリクエストは、抽象化プラットフォームプリミティブを実施するためのリクエストであり得、例えば、エンクレーブをインスタンス化するためのリクエスト、エンクレーブのアテステーションレポートを検証するためのリクエスト、エンクレーブの内側で関数を呼び出す(エンクレーブへコールインする)ためのリクエスト、およびエンクレーブとそのクライアントとの間で共有され得るメモリを割り当てるためのリクエストを含み得る。
[0109]抽象化プラットフォームリクエストは、動作1204〜1208においてネイティブプラットフォームリクエストへと翻訳され得る。受信したリクエストに含まれるか、またはその中で暗示されるパラメーターは、例えば、元のリクエスト内のパラメーターのデータ形式がネイティブプラットフォーム内のそのパラメーターのデータ形式と同じではないことが決定される場合、任意選択のステップ1204において変換され得る。例えば、エンクレーブまたはクライアントからのリクエストが、エンクレーブ抽象化アイデンティティなどの抽象化形式アテステーションレポートから導出されるパラメーターを含む場合、ネイティブエンクレーブアイデンティティなどのネイティブ形式アテステーションレポート内で使用されるパラメーターに変換されることになる。
[0110]ネイティブプラットフォームおよび受信したリクエストの呼び出し規則が異なることが決定される場合、呼び出し規則は、任意選択のステップ1206において変換され得る。呼び出し規則は、例えば、呼び出しスタック上のパラメーターを並べ替えること、プロセッサーレジスターと呼び出しスタックとの間でパラメーターを移動させること、ならびに、エラー値を返すことおよび例外ハンドラーを呼び出すことなどのエラー状態通信方法間で変換することによって変換され得る。
[0111]いくつかの実施形態において、ネイティブプラットフォームは、いくつかのリクエストでは抽象化プラットフォームと同一であり得、この場合、ボックス1204および1206の変換動作はスキップされ得る。
[0112]ボックス1208において、変換されたリクエストが、ネイティブプラットフォームによってリクエストを実施させるためにネイティブプラットフォームに送信される。例えば、ネイティブプラットフォームがIntel Software Guard Extensions(SGX)エンクレーブアーキテクチャに準拠する場合、ネイティブプラットフォームは、エンクレーブのためのプロセッサー命令を含み得る。この場合、ボックス1208においてリクエストを送信することは、エンクレーブのための1つまたは複数のプロセッサー命令を実行することを含み得る。別の例において、ネイティブプラットフォームは、エンクレーブのためのハイパーコールを有するハイパーバイザーを含み得るMicrosoft Virtual Secure Mode(VSM)エンクレーブアーキテクチャに準拠し得る。ハイパーコールは、ハイパーバイザーコードへのソフトウェアトラップであり、ハイパーコールは、特権操作が許可され得るコンテキストへのプロセッサーコンテキストの変更を引き起こし得る。このVSM例において、ボックス1208においてリクエストを送信することは、特権操作が許可され得るコンテキストへ実行コンテキストを切り替えるためのハイパーバイザーおよび/または他の機序へのハイパーコールを作ることを含み得る。
[0113]ここでネイティブプラットフォームへリクエストを送信することは、一般には、ネイティブプラットフォームの特徴を使用してリクエストを実施することを意味する。ネイティブプラットフォーム1208へリクエストを送信する動作は、ネイティブプラットフォームでの複数の動作に関与し得、エンクレーブを作成すること、アテステーション、データ密封、制御転送、または単調カウンターおよび信頼できる時刻の使用など、リクエストされる動作(またはプリミティブ)によって異なり得る。
[0114]CreateEnclaveプリミティブは、エンクレーブをインスタンス化するために使用され得る。エンクレーブをインスタンス化するためのCreateEnclaveリクエストは、セキュアコンテナを作成し(例えば、何らかのメモリを割り当て、そのメモリのためにセキュリティまたは隔離境界を確立することによって)、エンクレーブコードをそのセキュアコンテナ内へ(例えば、エンクレーブ画像から)コピーし、エンクレーブコード内へのエントリーポイントを構成するまたは可能にする(例えば、エンクレーブ画像内のエントリーポイントメタデータに従って)ことを、抽象化プラットフォームに行わせ得る。
[0115]エンクレーブ対応のハイパーバイザー(VSMなど、エンクレーブ管理機能を提供するハイパーバイザー)を有するネイティブプラットフォームにCreateEnclaveリクエストを送信することは、メモリを割り当てること、およびエンクレーブコンテナの外側のコードがそのメモリにアクセスすることを防ぐ様式でメモリのためのプロセッサーページテーブルをセットアップするためのハイパーコールを作ることを含み得る。抽象化プラットフォームからのエンクレーブ作成ハイパーコールはまた、ハイパーバイザーに、指定のエントリーポイントにおけるエンクレーブ内への制御転送のための構成情報をセットアップさせ得る。その後、セキュアコンテナの外側のコードは、セキュアコンテナの内側の指定のエントリーポイントにおける実行を転送するための制御転送ハイパーコールを作ることができる。
[0116]エンクレーブ対応プロセッサー(SGXなど、エンクレーブ管理プロセッサー命令を有するプロセッサー)を有するネイティブプラットフォームへのCreateEnclaveリクエストを送信することは、抽象化プラットフォームが、特定のメモリ領域がセキュアエンクレーブコンテナとして作成されるべきことをCPUに通知するためにECREATEなどの命令を実行すること、およびそのエンクレーブコンテナにデータページを追加するためにEADDなどの命令を実行することを含み得る。特別なプロセッサー命令はまた、エンクレーブ内への制御転送のためにエンクレーブ内のエントリーポイントを指定するためのメモリ内の特別なページを作成するために使用され得る。その後、セキュアコンテナの外側のコードは、そのエンクレーブエントリーポイントへ実行制御を転送するために指定のエントリーポイントのうちの1つを特定するEENTERなどの命令を実行することができる。
[0117]CreateReportプリミティブは、アテステーションレポートを作成するために使用され得る。エンクレーブのアテステーションレポートを作成するためのCreateReportリクエストは、図5および図7に関して上に説明されるような抽象化層によって実施され得る。エンクレーブ対応のハイパーバイザーでは、抽象化層は、実行状態を、例えば、署名付きのレポートへ使用され得る図7のPrivAK726などの秘密鍵へのアクセスを有するセキュリティモニターコンテキストへと変更するハイパーコールを作ることによって、リクエストをネイティブプラットフォームに送信し得る。この秘密鍵は、コンピューターがTPMに基づくTCGログで検証されるような健全な構成で起動された場合、セキュリティモニターコンテキストにだけ利用可能であり得る。セキュリティモニターは、レポートデータに、証明されているエンクレーブのアイデンティティをタグ付けし得る。
[0118]エンクレーブ対応のプロセッサーでは、CreateReportリクエストは、レポートを生成し、それをレポートに署名するためのプライベート鍵へのアクセスを有する特別なエンクレーブに送信するEREPORTなどの命令を実行することによって、ネイティブプラットフォームに送信され得る。
[0119]EnclaveSealプリミティブは、エンクレーブへデータを密封するために使用され得る。エンクレーブへデータを密封することは、エンクレーブと関連付けられる様式で、またはエンクレーブと関連付けられる鍵を用いて、データを暗号化する。EnclaveSealリクエストは、密封ポリシーを使用して、エンクレーブの状態のすべてまたは部分など、エンクレーブの内側に位置するデータをエンクレーブへ密封するためのリクエストであり得る。上のSEALING_POLICYなどの密封ポリシーは、どのエンクレーブがデータを開封することができるべきかを示すエンクレーブアイデンティティタイプを特定し得る。密封プロセス自体が、密封ポリシー内で特定されるエンクレーブアイデンティティと関連付けられた暗号化鍵を使用し得る。その後、特定されたアイデンティティタイプでの新しいエンクレーブのアイデンティティ値が、特定されたアイデンティティタイプでの密封エンクレーブのアイデンティティ値と同じである場合、新しいエンクレーブインスタンス化は、データを開封することが可能であり得る。
[0120]データ密封は、秘密または極秘エンクレーブデータが、非セキュアの記憶装置へ、例えば、エンクレーブのセキュアコンテナの外側のメモリへ、またはハードディスクなどの永続記憶装置などへ、安全にコピーされることを可能にする。密封データがエンクレーブ状態データであるとき、密封は、エンクレーブが以前の状態へとリセットされることを可能にし、またセキュアなエンクレーブ動作が中断され、その後別のエンクレーブ内で継続されることを可能にする。
[0121]エンクレーブ状態をリセットするために、まずエンクレーブの状態は、その状態をエンクレーブへ密封することによって保存される。密封は、エンクレーブと関連付けられた鍵を用いて状態データを暗号化することによって行われ得る。その後、おそらくはエンクレーブの状態が変更された後、密封された状態データは、密封データを復号し、次いでエンクレーブの現在の状態を復号されたデータと置き換えることによって(例えば、復号されたデータをエンクレーブのセキュアコンテナ内へコピーすることによって)、同じエンクレーブへ開封され得る。
[0122]セキュア動作を中断し、別のエンクレーブ内で継続するために、セキュア動作は、第1のエンクレーブ内に複数のプロセッサー命令を含む動作を実行することによって開始する。第1のエンクレーブが中断されるとき、そのエンクレーブの状態は、密封ポリシー内で特定されるエンクレーブアイデンティティへ密封され得、その密封データは、次いで、ローカルまたはクラウドベースの永続記憶装置など、非セキュアの記憶装置内に保存され得る。第1のエンクレーブは、次いで、(任意選択的に)終了され得るか、または他のエンクレーブ動作を開始し得る。第2のエンクレーブは、密封された状態データを第2のエンクレーブ内へ開封することによって、中断された動作を継続するためにインスタンス化またはリパーパスされ得る。中断された動作は、第1のエンクレーブが停止した場合に第2のエンクレーブ内で継続され得る。
[0123]エンクレーブ対応のハイパーバイザーでは、抽象化層は、ハイパーコールを作ることによってEnclaveSealリクエストをネイティブプラットフォームに送信し得る。ハイパーコールは、実行状態を、データを密封または開封するために使用され得るエンクレーブと関連付けられた秘密密封鍵へのアクセスを有するコンテキスト、例えば、セキュリティモニターコンテキストへ変更し得る。密封鍵は、エンクレーブアイデンティティおよびセキュリティモニターにだけ利用可能な秘密プラットフォーム鍵の組合せから導出され得る。このプラットフォーム鍵は、マシンが健全な構成で起動されるときにセキュリティモニターにのみ利用可能であり得、起動構成は、TPMに基づくTCGログで検証される。このエンクレーブ対応のハイパーバイザー実施形態において、エンクレーブコードは、密封鍵へのアクセスを決して有さない。
[0124]エンクレーブ対応のプロセッサーでは、EnclaveSealリクエストは、暗号化鍵を得るためにEGETKEYなどの命令を実行することによってネイティブプラットフォームに送信され得る。このアルゴリズムは、エンクレーブに固有である密封鍵を生成し得る。密封鍵は、エンクレーブのアイデンティティおよびプロセッサー内に埋め込まれた秘密から導出され得る。エンクレーブの内側のコードは、次いで、密封鍵を用いてデータを暗号化し得る。データは、例えば、エンクレーブの内側のコードによって、抽象化プラットフォームによって、またはネイティブプラットフォームによって、密封鍵を用いて暗号化することによって密封され得る。EnclaveUnsealは、同様に、開封鍵を生成するためにEGETKEYを使用し得る。
[0125]制御転送リクエストは、エンクレーブの内側の命令からエンクレーブの外側のエントリーポイントへ(例えば、CallEnclaveOut)、または逆にエンクレーブの外側の命令からエンクレーブの内側のエントリーポイントへ(例えば、CallEnclaveIn)、プロセッサー実行制御を転送するためのリクエストであり得る。これは、例えば、セキュアなデータベース動作のために行われ得る。データベースエンクレーブをインスタンス化した後、エンクレーブクライアントは、エンクレーブが、クエリを実施するデータベースエンクレーブの内側のエントリーポイントへ制御を転送するためにCallEnclaveInプリミティブを使用することによってデータベースクエリなどの特定の動作を実施することをリクエストし得る。エンクレーブがクエリを完了した後、クエリの結果は、クエリ結果を受信し得るクライアント内のエントリーポイントにおいてクライアントに制御を転送して戻すためのCallEnclaveOutプリミティブを用いて、(おそらくは結果を暗号化した後に)クライアントに返され得る。CallEnclaveInおよびCallEnclaveOutプリミティブは、エンクレーブとそのクライアントとの間で共有され得るメモリバッファへのポインターをとり得る(バッファは、エンクレーブまたはそのクライアントのいずれかによって読み込み可能、書き込み可能、および/または実行可能であり得る)。
[0126]エンクレーブ対応のハイパーバイザーでは、抽象化層は、ハイパーコールを作ることによってCallEnclaveInリクエストをネイティブプラットフォームに送信し得る。ハイパーコールは、実行状態を、CPUレジスターを保存し、エンクレーブCPUレジスター値の以前に保存されたセットをリストアし(おそらくはエンクレーブメモリから)、エンクレーブの保護されたメモリへのアクセスを可能にするためにページテーブル構成を変更し、エンクレーブの内側で関数エントリーポイントを呼び出すコンテキスト、例えば、セキュリティモニターコンテキストへ変更し得る。同様に、抽象化プラットフォームがCallEnclaveOutリクエストを受信するとき、リクエストは、エンクレーブCPUレジスターを保存し(おそらくはエンクレーブメモリへ保存する)、エンクレーブクライアントのための以前に保存されたCPUレジスターをリストアし、エンクレーブメモリへのアクセスを防ぐためにページテーブル構成を変更し、エンクレーブの外側のエンクレーブクライアント内のエントリーポイントへプロセッサー制御を転送するハイパーコールによって、ネイティブプラットフォームへ送信され得る。
[0127]エンクレーブ対応のプロセッサーでは、CallEnclaveInリクエストは、エンクレーブCPUレジスターのセットをリストアし(おそらくはエンクレーブメモリから)、エンクレーブの内側で関数を呼び出す(エントリーポイントへ制御を転送する)ことをCPUに行わせ得るEENTERなどの命令を実行することによって、ネイティブプラットフォームに送信され得る。CallEnclaveOutプリミティブは、エンクレーブの外側の命令に制御を転送し得る、および/またはエンクレーブの外側の制御を転送する故障を引き起こし得るEEXITなどの命令を実行し得る。
[0128]単調カウンターは、様々な用途を有し得る。例えば、エンクレーブは、その状態がどれくらい前まで戻されるかを制限することを望み得る。単調カウンターは、図4に関して上に論じられるように、例えば、メッセージの新鮮性を保証するためのノンスとして使用され得る。単調カウンターは、一般的に、読み込まれる、および増分される能力を有するが、減少されることはできない。ロールバックまたはエンクレーブの状態を戻すことを制限するために、エンクレーブの内側のコードは、関連付けられた単調カウンターを増分し、次いでエンクレーブの内部状態と一緒にカウンターの値を保存し得る。状態およびカウンター値は、例えば、EnclaveSealプリミティブを用いて保存され得る。その後、例えば、EnclaveUnsealプリミティブを使用してエンクレーブ状態をリストアするとき、エンクレーブの内側のコードは、単調カウンターの現在の値を読み込み得、それを開封された状態のカウンター値と比較する。開封された状態でのカウンターの値がカウンターの現在の値よりも小さい場合、エンクレーブは、開封された状態の使用を防ぎ得る。
[0129]エンクレーブ対応のハイパーバイザーでは、抽象化層は、エンクレーブに露出されるハイパーコールを作ることによって、単調カウンターを読み込むか、または増分するためにネイティブプラットフォームにリクエストを送信し得る。カウンターを読み込むか、または増分するためのハイパーコールが呼び出されると、プロセッサーは、実行状態を、セキュリティモニターなどの、ハイパーコールを作るエンクレーブのアイデンティティを検証するコンテキストへと変更し、次いで、それぞれ、例えば、TPMチップなどの不揮発性記憶装置に格納された対応する単調カウンターから読み込むか、またはこの単調カウンターを増分する。代替的に、セキュリティモニターが、リモートトラステッドサーバーまたはリモートトラステッドサーバーのセットに格納されたカウンターを、そのようなサーバーとのセキュア通信チャネルを確立し、それに特定された単調カウンターを読み込むか、または増分するように要求することによって、読み込み得るか、または増分し得る。リモートトラステッドサーバーは、エンクレーブの内側のカウンターを、ホストコンピューター内の残りのコードからそれを隔離するように維持し得る。
[0130]エンクレーブ対応のプロセッサーでは、リクエストは、命令を実行することによってネイティブプラットフォームに送信され得る。そのようなプロセッサーでは、単調カウンタープリミティブは、コンピューターマザーボード内のチップ内の不揮発性メモリ記憶装置内のカウンターを読み込むか、または増分することによって、実施され得る。代替的に、これらのプリミティブはまた、エンクレーブ対応のハイパーバイザーと同様、トラステッドリムーブサーバーを使用して実施され得る。
[0131]図13は、ネイティブエンクレーブプラットフォームを抽象化する方法1300の例示的なフローチャートを描写する。エンクレーブ抽象化プラットフォームは、ボックス1302において、エンクレーブまたはエンクレーブクライアントからリクエストを受信し得る。ボックス1304において、抽象化プラットフォームは、例えば、ネイティブプラットフォームがSGXに準拠するかどうかを決定することによって、ネイティブプラットフォームがエンクレーブプロセッサー命令を含むかどうかを決定し得る。もしそうである場合、エンクレーブプロセッサー命令が、ボックス1306において実行される。ボックス1308において、抽象化プラットフォームは、例えば、ネイティブプラットフォームがVSMに準拠するかどうかを決定することによって、ネイティブプラットフォームがエンクレーブハイパーコールを含むかどうかを決定し得る。もしそうである場合、ネイティブプラットフォームは、エンクレーブハイパーコールを作る。エンクレーブ命令を実行することまたはエンクレーブハイパーコールを呼び出すことからの結果は、ボックス1312においてクリーンアップされる。クリーンアップは、例えば、エンクレーブプロセッサー命令またはエンクレーブハイパーコールの出力パラメーターまたは例外処理を抽象化層インターフェースの形式またはプロトコルへ変換することを含み得る。変換された出力パラメーターは、次いで、ボックス1314において元の要求元(エンクレーブまたはクライアント)に戻される。
抽象エンクレーブアイデンティティ
[0132]図14は、エンクレーブをインスタンス化するために使用される例示的なエンクレーブバイナリ画像を描写する。エンクレーブは、エンクレーブコンテナ1490などのセキュアコンテナを作成し、1つまたは複数のエンクレーブ画像の部分をコンテナ内へコピーすることによって、インスタンス化され得る。エンクレーブコンテナ1490は、一次エンクレーブ画像1410への参照により作成されている場合がある。一次画像は、他の依存エンクレーブ画像への参照を含み得る。この例では、一次画像1410は、それぞれ依存エンクレーブ画像1420および1450への参照として依存関係1および依存関係2を含む。画像1420は、画像1430および1440に対するさらなる依存関係を含む一方、画像1450は、画像1460に依存する。これらすべての画像(またはそれらの部分)がコンテナ1490内へコピーされると、結果として生じるエンクレーブは、インスタンス化されたエンクレーブに固有または特有であるコードおよびデータを含み得る非プラットフォーム画像1402と、抽象化プラットフォーム1404画像と、ネイティブプラットフォーム画像1406とを含み得る。
[0133]一次画像1410などの各エンクレーブ画像は、ID、依存関係、コード、データ、および画像のオーサーの署名を含み得る。画像1410の例では、2つのID1410.1および1410.2が含まれる。これらのIDは、そのエンクレーブ画像を用いてインスタンス化される任意のエンクレーブを識別するために個別にまたはまとめて使用され得る、例えば、ImageID、FamilyID、またはAuthorID値に対応する抽象アイデンティティ値を特定するUUIDであり得る。描写されるように、画像1410は、2つのIDを有するが、より少ないまたはより多くのIDが実現可能である。画像1410内のコードは、エンクレーブコンテナ1490をホストするコンピューターのプロセッサーにより実行可能なバイナリ命令であり得る。画像1410内のデータは、コンテナ1410内へロードされる任意のコードによって使用され得る。画像1410はまた、ID、依存関係リファレンス、コード、およびデータなどの画像の他のコンテンツのいずれかまたはすべての完全性を確実にするために署名Sig1410を含み得る。他の画像1420〜1460は同様に、ID、依存関係リファレンス、コード、データ、および署名を含み得る。
[0134]依存1および依存2または画像1410、画像1420の依存1および依存2、ならびに画像1450の依存関係1などの依存関係指標は、様々なやり方で特定され得る。画像1410〜1460は、コンピューターシステムのメモリに格納される場合、依存関係指標は、単純にメモリ内のアドレスであり得る。エンクレーブ画像がファイルシステム内のファイルである場合、リファレンスは、ファイル名であり得る。いくつかの実施形態において、リファレンスは、論理識別子であり得る。論理識別子は、UUIDなどの固有の数字であり得るか、または、依存関係画像を別の方法で識別する文字列などの他のデータであり得る。例えば、文字列は、依存バイナリ画像のオーサー、ソース、製品名、製品ファミリー、および/またはバージョン番号を示し得る。論理識別子は、依存バイナリのコピーが取得され得る場所など、ウェブまたはインターネットの場所を含む。
[0135]いくつかの実施形態において、エンクレーブ画像ファイルは、参照されるエンクレーブ画像の現在のバージョンまたはローカルコピーへのポインターを探すためにエンクレーブ画像のレジストリー内の論理識別子などの依存関係指標を検索することによって位置特定され得る。いくつかの場合においては、トラステッドサービスが、特定のエンクレーブ画像または画像位置の識別へと依存関係指標を解決するために使用され得る。
[0136]いくつかの実施形態において、依存関係指標は、目的とする依存エンクレーブバイナリ画像の暗号学的ハッシュなど、暗号学的にセキュアな識別子であり得る。そのようなハッシュは、依存バイナリのすべて、またはその一部分のみを含み得る。依存関係指標に含まれる依存バイナリの一部分は、ID1410.1またはID1420.2などの抽象アイデンティティ値を含み得、また抽象アイデンティティ値であり得る。エンクレーブ依存関係を決定するエンティティは、正しい依存画像が依存バイナリ自体のハッシュをコンピューティングすることによって見つけられたことを検証することができる場合があるため、暗号学的にセキュアな識別子のための解決サービスは、論理識別子と同じように信頼される必要がない場合がある。
[0137]図15は、抽象エンクレーブアイデンティティを用いてエンクレーブ動作を実施する方法1500の例示的なフローチャートを描写する。エンクレーブのための抽象アイデンティティ値は、何らかの特徴を共通して有するが正確には同一ではない2つのエンクレーブ間の等価性を決定するための基礎を提供し得る。アイデンティティ値は、アテステーションレポートに含まれ得、抽象アイデンティティタイプ(そのようなExactHash、InstanceHash、ImageID、FamilyID、またはAuthorID)と関連付けられ得る。正確には同じではない2つのエンクレーブは、抽象アイデンティティタイプについて同じ抽象アイデンティティ値を有し得る。加えて、2つの異なるネイティブエンクレーブプラットフォーム上でセキュアコンテナ内へインスタンス化される同一のエンクレーブコードもまた、同じ抽象アイデンティティ値を有し得る。方法1500は、例えば、ネイティブエンクレーブプラットフォームとエンクレーブまたはエンクレーブクライアントのいずれかとの間の抽象化プラットフォーム層によって実施され得る。
[0138]ボックス1502において、エンクレーブは、図14の一次エンクレーブ画像1410などのエンクレーブ画像からインスタンス化される。エンクレーブ画像は、エンクレーブコード、データ、アイデンティティのリスト、依存エンクレーブ画像のリスト、および署名を含む一次画像であり得る。エンクレーブ画像の完全性を確実にするために、画像は、エンクレーブ画像のオーサーに対応し得るプライベート鍵を用いて署名され得る。エンクレーブ画像内のエンクレーブアイデンティティIDのリストは、ImageID、FamilyID、およびAuthorIDなどの抽象アイデンティティタイプに対応し得、各々が、他の関連エンクレーブ画像と一緒に、エンクレーブ画像をまとめて識別することを目的とされる。依存エンクレーブ画像のリストは、一次エンクレーブ画像内のコードが依存するエンクレーブコードを含む他のエンクレーブ画像を指し得る。依存エンクレーブ画像は、同じオーサーによって著作される場合とそうでない場合とがあり、いくつかの依存エンクレーブ画像は、一次エンクレーブ画像または一次エンクレーブ画像のオーサーと特に関連付けられるのではなく、概してエンクレーブプラットフォーム(抽象化プラットフォームまたはネイティブプラットフォームのいずれか)と関連付けられ得る。エンクレーブは、任意のネイティブエンクレーブプラットフォームを使用してセキュアエンクレーブコンテナを作成し、一次画像のすべてまたは一部分および任意の依存エンクレーブ画像をセキュアコンテナ内へコピーすることによって、インスタンス化され得る。
[0139]ボックス1503において、エンクレーブ動作は、エンクレーブアイデンティティタイプと一緒に、例えば、エンクレーブまたはエンクレーブクライアントによってリクエストされる。アイデンティティタイプは、ImageIDまたはAuthorIDなどの抽象アイデンティティのタイプを特定し得、特定のインスタンス化されたエンクレーブに関連し得るが、そのエンクレーブのAuthorID値を特定しない。ボックス1503に続く方法1500の残りの部分は、インスタンス化されたエンクレーブのそのアイデンティティタイプのために導出されたアイデンティティ値を使用して、インスタンス化されたエンクレーブを用いて動作(アテステーション、データ密封、または単調カウンターの使用など)を実施するための動作を説明する。アイデンティティは、エンクレーブ画像のサブセットのハッシュを使用して決定され得る。エンクレーブ画像のどのサブセットがハッシュへの入力として使用されるかは、エンクレーブ動作において使用されることが望まれるアイデンティティタイプに部分的に基づき得る。
[0140]ボックス1504において、本明細書ではアイデンティティ部と呼ばれるエンクレーブ画像の一部分は、アイデンティティタイプに基づいて決定される。アイデンティティ部は、ボックス1502においてエンクレーブをインスタンス化するために使用される様々なエンクレーブバイナリ画像のすべてを含み得る、部分を含み得る、またはいずれも含まない場合がある。アイデンティティ部は、エンクレーブ画像内に含まれるエンクレーブコードのすべてを含み得る、部分を含み得る、またはいずれも含まない場合がある。アイデンティティ部はまた、含まれるエンクレーブ画像の非コード部内にリストされる、ゼロ、1つ、またはそれ以上のアイデンティティIDを含み得る。アイデンティティ部はまた、エンクレーブ画像に含まれるエンクレーブデータを含む場合とそうでない場合とがある。アイデンティティ部は、エンクレーブ画像のこれらの様々な部分の任意の組合せを含み得る。例えば、アイデンティティ部は、すべてのコードを含み、いずれのデータも含まず、2つまたは4つの利用可能なアイデンティティIDを含む場合がある。任意選択のボックス1506において、どの依存エンクレーブ画像がアイデンティティ部に含まれるべきかが決定され、またそれぞれの含まれる画像のアイデンティティ部が決定される。
[0141]依存画像のアイデンティティ部は、一次エンクレーブ画像のアイデンティティ部と同じ場合とそうでない場合とがある。例えば、すべてのコードおよびImageIDが、一次画像のアイデンティティ部に含まれる一方、依存画像のアイデンティティ部内には、コードは含まれず、依存画像のFamilyIDだけが含まれ得る。
[0142]エンクレーブコードがアイデンティティ部に含まれるとき、アイデンティティ部内のエンクレーブコードの一部分は、アイデンティティタイプの組合せ、およびどの依存関係がアイデンティティ部に含まれるべきかの標示によって決定され得る。アイデンティティタイプInstanceHashは、例えば、一次画像内にエンクレーブコードを含み得るが、依存画像には含まず、アイデンティティタイプExactHashは、エンクレーブプラットフォームの部分と見なされないすべての依存画像内にエンクレーブコードを含み得る。例えば、エンクレーブプラットフォームオーサーのプライベート鍵を用いて署名されないすべての依存エンクレーブ画像は、エンクレーブプラットフォームの部分ではないと見なされ得る。代替的に、または加えて、一次画像は、どの依存エンクレーブ画像が、InstanceHashまたはExactHashアイデンティティタイプのためのアイデンティティ部に含まれるべきか、または除外されるべきかのリストを含み得る。
[0143]エンクレーブ画像にメタデータとして含まれ得るエンクレーブアイデンティティIDは、エンクレーブコードの代わりに、またはそれに加えて、エンクレーブ画像のアイデンティティ部に含まれ得る。例えば、アイデンティティタイプImageID、FamilyID、およびAuthorIDのためのアイデンティティ部は、エンクレーブ画像からの対応するIDメタデータを含み得る。アイデンティティタイプがネスト化または層化されるとき、より低いレベルタイプのアイデンティティ部は、より高いレベルタイプのIDデータを含み得る。例えば、ImageIDのためのアイデンティティ部は、ImageID、FamilyID、およびAuthorIDのためのIDデータを含み得る一方、AuthorIDのためのアイデンティティ部は、AuthorIDのためのIDデータのみを含み得る。
[0144]InstanceHashおよびExactHashなどのエンクレーブコードを含むアイデンティティタイプは、特定のエンクレーブコードがエンクレーブの内側で実行しているという、例えば、アテステーションによるエンクレーブクライアントへのより高いレベルの確証を提供する。しかしながら、エンクレーブのアイデンティティは、エンクレーブコードのアイデンティティ部のいずれかが変化するときに必ず変化することになる。例えば、セキュリティ処置または他のバグがエンクレーブ画像の新しいバージョンで修正される場合、新しいコードに基づく結果として生じるアイデンティティ値も変化することになる。エンクレーブコードの特定の部分がアイデンティティハッシュ計算から除外される機序を提供することによって、エンクレーブのアイデンティティは、エンクレーブコードの除外された部分への変更から切り離され得る。例えば、あるオーサーのエンクレーブコードがエンクレーブプラットフォームによって提供されるエンクレーブコードに依存するとき、エンクレーブアイデンティティは、依存プラットフォームへの改正から切り離され得る。
[0145]ボックス1508において、ボックス1502においてインスタンス化されるエンクレーブのアイデンティティを表し得るアイデンティティ値が決定される。アイデンティティ値は、エンクレーブ画像の以前に決定されたアイデンティティ部についてハッシュを計算することによって決定され得る(アイデンティティ値は、アイデンティティ部がハッシュ関数への入力である場合、ハッシュ関数の出力である)。いくつかの実施形態において、ハッシュ関数への入力は、元のエンクレーブ画像の一部分であるが、他の実施形態において、ハッシュ関数への入力は、画像のアイデンティティ部がコンテナ内へコピーされた(およびおそらくは、元のエンクレーブ画像が暗号化される場合には、アイデンティティ部を復号した)後のエンクレーブコンテナの一部分である。
[0146]ボックス1510において、結果として生じるアイデンティティ値の完全性は、元のエンクレーブ画像の完全性を検証することによって、任意選択的に検証され得る。エンクレーブ画像の完全性は、エンクレーブ画像に署名するために使用されるプライベート鍵に対応する公開鍵を用いて検証され得る。そのような公開/プライベート鍵ペアは、例えば、エンクレーブ画像のオーサーと関連付けられ得るため、結果として生じるアイデンティティ値における信頼は、エンクレーブのオーサーの信頼に根差し得る。
[0147]最後に、ボックス1512において、インスタンス化されたエンクレーブに関する動作が、アイデンティティ値を使用して実施され得る。例えば、インスタンス化されたエンクレーブのアテステーションレポートが、アイデンティティタイプについて生成または検証され得、データが、アイデンティティにおいて、インスタンス化されたエンクレーブへ密封され得るか、またはそこから開封され得、ならびに、インスタンス化されたエンクレーブおよびアイデンティティタイプに結び付けられた単調カウンターまたは信頼できる時刻が使用され得る。
[0148]より高いレベルのアイデンティティタイプを使用したエンクレーブ動作は、可能性のあるエンクレーブインスタンス化のグループ間の相互作用を可能にする。高レベルアイデンティティタイプへのアテステーションは、同じ高レベルアイデンティティを有するすべてのエンクレーブのためのアテステーションレポート等価性を提供し得る。例えば、AuthorIDアイデンティティタイプへのアテステーションレポートは、同じAuthorIDメタデータを含む一次画像からインスタンス化されるすべてのエンクレーブからのアテステーションレポートに等価であり得る。高レベルアイデンティティタイプへ密封されるデータは、同じ高レベルアイデンティティ値を有する任意のエンクレーブによって開封され得る。例えば、AuthorIDアイデンティティタイプを有するインスタンス化されたエンクレーブへ密封されるデータは、そのエンクレーブ一次画像内の同じAuthorIDメタデータを有する任意の他のインスタンス化されたエンクレーブによって開封され得る。
エンクレーブアイデンティティ等価性
[0149]図16は、抽象エンクレーブアイデンティティ等価性を有する例示的なシステムを描写する。エンクレーブクライアント1602は、抽象化プラットフォーム1614を介して、第1のネイティブプラットフォーム1616のセキュアエンクレーブコンテナ内でインスタンス化される第1のエンクレーブ1612と通信し得、クライアント1602はまた、抽象化プラットフォーム1624を介して、第2のネイティブプラットフォーム1626のセキュアエンクレーブコンテナ内でインスタンス化される第2のエンクレーブ1622と通信し得る。第1のネイティブプラットフォーム1616は、第2のネイティブプラットフォームと同じコンピューター上に存在する場合とそうでない場合とがある。エンクレーブクライアント1602は、ネイティブプラットフォームのいずれかと同じコンピューター上に存在し得るか、または別個の第3のコンピューター上に存在し得る。第1のネイティブプラットフォーム1616は、第2のネイティブプラットフォーム1626と同じではない場合がある。例えば、第1のネイティブプラットフォーム1616は、同じネイティブプラットフォーム製造業者からの第2のネイティブプラットフォームの古いバージョンであり得る。代替的に、第1のネイティブプラットフォーム1616および第2のネイティブプラットフォーム1626は、VSMおよびSGXなど、完全に異なるエンクレーブアーキテクチャに準拠し得る。
[0150]エンクレーブクライアントは、アテステーションレポートから導出されるアイデンティティ値を比較することによってエンクレーブが等価であることをセキュアに決定し得る。エンクレーブクライアント1602は、第1のエンクレーブ1612および第2のエンクレーブ1622から別個のアテステーションレポートを受信することによってエンクレーブの各々をセキュアに識別し得る。アイデンティティ値は、これらのアテステーションレポートの各々に含まれ得る(またはそれから導出され得る)。アイデンティティ値が同じである場合、エンクレーブクライアント1602は、第1のエンクレーブ1612および第2のエンクレーブ1622がある意味では等価であることに自信を有し得る。アテステーションレポートからのアイデンティティ値は、特定の抽象アイデンティティタイプ(そのようなExactHash、InstanceHash、ImageID、FamilyID、またはAuthorID)に対応する抽象アイデンティティ値、またはそのような抽象アイデンティティ値のハッシュであり得る。この場合、等価性は、エンクレーブが正確には同一ではない場合に決定され得る。2つのエンクレーブは、正確には同一ではない場合があるが、例えば、エンクレーブコンテナ内へロードされるエンクレーブ画像が、同じ機能性の異なるバージョンであるか、または異なる依存画像を有する同じ一次画像であるか、または異なるエンクレーブアーキテクチャのエンクレーブコンテナ内へロードされる同じエンクレーブ画像である場合には等価であると依然として決定され得る。
[0151]第1のエンクレーブ1612は、様々な状況では第2のエンクレーブ1622に等価であるが同一ではないと見なされ得る。第1の例では、エンクレーブコンテナ内へ最初にロードされるコードのサブセットのみが同じ(例えば、抽象アイデンティティタイプExactHashまたはInstanceHashについて等価)である。第2の例では、エンクレーブコードのオーサーは、2つのバイナリ画像内のコードが異なるとしても、2つの異なるエンクレーブバイナリ画像内に同一のIDを含んでいる場合がある(例えば、アイデンティティタイプImageID、FamilyID、またはAuthorIDについて等価)。第3の例では、各エンクレーブ内のコードは、全く同じであるが、異なるネイティブプラットフォーム上にロードされる(インスタンス化される)。この第3の例では、第1のネイティブプラットフォーム1616および第2のネイティブプラットフォーム1626は、異なる製造業者によって製造され得、したがって異なるアテステーションレポートの信頼は、異なる製造業者の異なる認証局に根差す(図7、要素738を参照のこと)。2つのネイティブプラットフォームが異なる例は、サーバーファーム内またはクラウドコンピューティング内であり、ここでは第1および第2のエンクレーブの処理作業負荷に割り当てられるサーバーは、同じネイティブエンクレーブプラットフォームをサポートしないサーバーである。
[0152]代替的な実施形態において、第1のエンクレーブは、第2のエンクレーブのクライアントであり得るため、結果として、ボックス1602および1612は組み合わされる。この実施形態においてエンクレーブ等価性を決定することは、第1のエンクレーブ内で、第2のエンクレーブのアテステーションレポートからのアイデンティティ値が第1のエンクレーブの独自のアイデンティティ値と同じである(特定の抽象アイデンティティレベルで)ことを決定することを含み得る。
[0153]図17は、2つの等価のエンクレーブを用いた並列処理の例示的なフローチャートを描写する。プロセス1700は、例えば、2つ以上の異なるエンクレーブのクライアントによって実施され得る。ボックス1702において、2つのエンクレーブは、例えば図16に描写されるように、異なるネイティブプラットフォームインスタンス上でインスタンス化される。エンクレーブは、抽象化プラットフォーム1614および1624のCreateEnclave方法によりエンクレーブバイナリ画像(図14の一次画像1410など)を特定するエンクレーブクライアントによってインスタンス化され得る。2つのエンクレーブをインスタンス化するために特定されるエンクレーブバイナリ画像は、同じ、または異なる場合がある。それぞれのインスタンス化されたエンクレーブのためのアテステーションレポートは、ボックス1704において作成される。アテステーションレポートは、例えば、エンクレーブクライアントのリクエストで、またはエンクレーブ自身のリクエストで作成され得る。エンクレーブクライアントなどの2つのエンクレーブの等価性を証明することを望むエンティティは、両方のアテステーションレポートのコピーを得る。アテステーションレポートは、ボックス1706において任意選択的に検証され得る。例えば、レポートの完全性は、アテステーションレポートをもたらしたネイティブプラットフォームの承認証明書(図7、要素728など)を用いてアテステーション署名を検証することによって検証され得る。さらに、承認証明書は、ネイティブプラットフォーム製造業者の公開鍵(図7、要素732など)を用いて検証され得る。アイデンティティ値(またはそのハッシュ)は、ボックス1708において各アテステーションレポートから抽出され得、2つのエンクレーブの等価性は、抽出されたアイデンティティ値が各エンクレーブで同じであることを検証することによって決定され得る。これらのアイデンティティ値は、アイデンティティタイプと関連付けられた抽象アイデンティティ値(またはそのハッシュ)であり得る。
[0154]エンクレーブクライアントがボックス1708および1710における動作から2つのエンクレーブインスタンス化の等価性を証明した後は、2つのエンクレーブは、示される等価性のタイプによって、区別なしに使用され得る。ボックス1712〜1720は、2つのインスタンス化された等価のエンクレーブを並列処理様式で使用するための等価のエンクレーブを使用する例示的な方法を描写する。ボックス1712および1716において、データベースの一部分またはデジタル画像ファイルの一部分など、入力データセットの一部分が、第1および第2のエンクレーブ内へコピーされる。コピーされるデータセットの一部分は、目の前にある処理タスクによって同一であるか、または異なる場合がある。処理動作は、同時に、ボックス1714において第1のエンクレーブ内での動作を部分的に実施すること、およびボックス1718において第2のエンクレーブ内での動作を部分的に実施することによって、並列でセキュアに実施され得る。動作は、例えば、データベースを検索すること、または画像処理動作を実施することであり得る。第1のエンクレーブは、データベースの第1の半分を検索し得るか、または画像の第1の半分に対して画像処理動作を実施し得る一方、第2のエンクレーブは、データベースの第2の半分を検索し得るか、または画像の第2の半分に対して画像処理動作を実施し得る。最後に、ボックス1720において、第1および第2のエンクレーブ内での並列処理の結果は、例えば、データベースの2つのソートされた半分を組み合わせること、または2つの画像半分をつなぎ合わせることによって、組み合わされ得る。
[0155]図18は、2つの等価のエンクレーブを用いた逐次処理の例示的なフローチャートを描写する。図18に描写されるように、データベース動作または画像処理動作などのエンクレーブ動作は、2つの別個のエンクレーブ内で2つの連続的部分においてセキュアに行われる。プロセス1800は、例えば、図16のエンクレーブクライアント1602によって実施され得る。ボックス1802において、第1のエンクレーブが、第1のネイティブエンクレーブプラットフォーム上で作成され、第1のエンクレーブのアテステーションレポートが、ボックス1804において作成される。この第1のアテステーションレポート(第1のエンクレーブの)は、例えば、図17のボックス1706に関して上に説明されるように、ボックス1806において検証され得る。ボックス1808において、セキュア動作が、第1のエンクレーブ内で開始されるが、完了はされない。第1のエンクレーブの状態は、ボックス1810において、第1のエンクレーブから外へ安全に移動されるように任意選択的に密封され得る。例えば、第1のエンクレーブ状態は、第1のエンクレーブのアイデンティティタイプへ密封され得る。エンクレーブ状態が一旦保存されると、第1のエンクレーブは終了され得る(描かれていない)。
[0156]第2のエンクレーブは、ボックス1812において開始して使用される。ボックス1812において、第2のエンクレーブは、第2のネイティブプラットフォーム上でインスタンス化される。図16および図17にあるように、第2のネイティブプラットフォームは、第1のネイティブプラットフォームと同じコンピューター上でホストされる場合とそうでない場合とがあり、第1および第2のネイティブプラットフォームは、同じであるか、または異なる場合がある。第2のネイティブプラットフォームのアテステーションレポートは、ボックス1814において作成され、また、任意選択的に、この第2のアテステーションレポートは、ボックス1816において検証され得る。第1および第2のアテステーションレポートからのアイデンティティ値は、第1および第2のエンクレーブの等価性を検証するために、ボックス1818において比較され得る。代替的な実施形態において、第2のエンクレーブは、セキュア動作がボックス1808において第1のエンクレーブ内で開始される前に、インスタンス化されかつ等価性検証され得る(ボックス1812〜1818)。第1のエンクレーブ内で開始されるセキュア動作を継続するために、第1のエンクレーブからの密封状態は、ボックス1820において第2のエンクレーブ内へコピーされ開封され得る。ボックス1822において、セキュア動作は、第2のエンクレーブ内で完了される(状態がコピーされた場合は、第1のエンクレーブからセキュアにコピーされるエンクレーブ状態を使用して)。
分散データ密封
[0157]図19は、例示的な分散データ密封システムのブロック図である。データ密封は、複数のエンクレーブにわたって分散され得、この場合、これらのエンクレーブは、別個のネイティブエンクレーブプラットフォーム上、および/または別個のコンピューター上でホストされる。上に説明されるように、EnclaveSealおよびEnclaveUnseal抽象化プリミティブは、エンクレーブが実行しているネイティブエンクレーブプラットフォームまたは物理的なコンピューターに結び付けられる鍵を使用してエンクレーブのためのデータを密封および開封し得る。これは、同じコンピューターまたは同じネイティブエンクレーブプラットフォームインスタンス上でホストされるエンクレーブにのみ開封を制限し得る。図19は、データを密封または開封することが、エンクレーブをホストするネイティブプラットフォームおよびコンピューターとは異なるネイティブプラットフォームまたはコンピューター上で発生し得る分散データ密封システムを描写する。システム1900は、コンピューター1910、1930、1950を、コンピューター1910および1930を接続するネットワーク1902、ならびにコンピューター1930および1950を接続するネットワーク1904と共に含む。コンピューター1910は、発信元エンクレーブ1912をホストし、この発信元エンクレーブ1912から密封されるべきデータが供給され得、コンピューター1930は、分散密封および開封リクエストをサービスするための分散密封エンクレーブ(DSE)1932をホストし、コンピューター1950は、以前に密封されたデータが開封される宛先エンクレーブ1952をホストする。図9に関して上に説明されるように、エンクレーブ1912、1932、1952は、エンクレーブ抽象化プロトコルを介して、抽象化プラットフォーム1914、1934、1954と通信し得、抽象化プラットフォーム1914、1934、1954は、ネイティブプロトコルを介して、ネイティブプラットフォーム1916、1936、および1956とそれぞれ通信し得る。代替的な実施形態において、1つまたは複数のエンクレーブ1912、1932、1950は、中間の抽象化プラットフォームなしにネイティブプラットフォーム1961、1936、1956上で直接的にホストされ得る。密封データ1938は、DSE1932またはそのホスティングネイティブプラットフォーム1936と関連付けられた鍵を使用してDSE1932へ密封されるデータであり得る。密封データ1938は、DSE1932のセキュアエンクレーブコンテナの外側のコンピューター1930上など、あまり保護されていない場所、例えば、コンピューター1930のメモリ空間内またはハードディスクのファイルシステム内の他の場所に格納され得る。
[0158]分散データ密封は、例えば、ネットワーク1902を介したDSE1932のアテステーションによる、発信元エンクレーブへのDSE1930の認証を含み得る。発信元エンクレーブ1912が一旦DSE1932を信頼すると、発信元エンクレーブ1912は、セキュア通信チャネルを介してDSE1932による密封のための密封ポリシーと一緒に極秘データをDSE1932に送信し得る。DSE1932は、次いで、エンクレーブ1912からのデータをそれ自体の中に密封し、その密封データを非セキュアの記憶装置に格納し得る。その後、宛先エンクレーブ1952は、以前に密封されたデータをリクエストし得る。データを開封するために、DSE1932は、宛先エンクレーブ1952を、例えば、ネットワーク1904を介したアテステーションによって認証し、宛先エンクレーブ1952のための開封が発信元エンクレーブ1912によって提供される密封ポリシーに従って許可されることを検証し得る。DSE1932は、発信元エンクレーブ1912からの以前に密封されたデータを開封し、次いで開封されたデータをセキュア通信チャネルを介して宛先エンクレーブ1952に送信し得る。エンクレーブデータは、ネットワーク1902および1904を介して、エンクレーブデータを暗号化することによってDSE1932へおよびDSE1932からセキュアに通信され得る。例えば、ネットワーク1902を介して送信されるエンクレーブデータは、発信元エンクレーブ1912へのDSE1932のアテステーション中に生成される鍵を用いて暗号化され得、ネットワーク1904を介して送信されるデータは、DSE1932への宛先エンクレーブ1952のアテステーション中に生成される鍵を用いて暗号化され得る。宛先の公開鍵、例えば、DSEと関連付けられた公開鍵、または宛先エンクレーブと関連付けられた公開鍵を用いた暗号化など、他のセキュア通信チャネルが可能である。
[0159]分散密封および開封で使用されるエンクレーブアイデンティティは、抽象エンクレーブアイデンティティである場合とそうでない場合とがある。例えば、抽象化プラットフォーム層を用いたいくつかの実施形態において、発信元エンクレーブによって特定され、DSEによって実行されるものなどの密封ポリシーは、許可された開封エンクレーブアイデンティティを識別し得、ここでは、許可された開封エンクレーブアイデンティティは、例えば、抽象エンクレーブアイデンティティのリスト、または発信元エンクレーブの抽象アイデンティティ値と組み合わせた抽象アイデンティティタイプのリストである。他の状況において、非抽象アイデンティティが使用され得る。例えば、いくつかの実施形態において、DSEは、一般に利用可能なコードで実施され得るため、結果としてDSEにおける信頼は、そのコードのオーサーにおける信頼に対立するものとして、そのコードの知識における信頼である。この例では、DSEのアテステーションは、DSEの公開コードのすべての署名付きハッシュであり得、ハッシュ関数への入力は、オーサーによって指定された抽象アイデンティティ値を含まない場合がある。
[0160]いくつかの実施形態において、ネイティブプラットフォーム1916、1936、1956が同じネイティブエンクレーブプラットフォームアーキテクチャの同じバージョンに準拠するとしても、それらが異なるコンピューター上1910、1930、1950でホストされることから、ネイティブプラットフォーム1916、1936、1956は、別個のネイティブプラットフォームである。他の実施形態において、ネイティブプラットフォーム1916、1936、1956は、異なるプラットフォームアーキテクチャ、または同じネイティブエンクレーブプラットフォームアーキテクチャの異なるバージョンに準拠し得る。密封ポリシー内の抽象アイデンティティの使用は、発信元および宛先エンクレーブを異なるネイティブプラットフォームアーキテクチャ上でホストすることを促進し得る。
[0161]図19に描かれていない分散データ密封の他の実施形態において、3つの別個のコンピューター(別個のコンピューター1910、1930、1950など)が存在しない場合がある。例えば、発信元および宛先エンクレーブは、1つのコンピューター上(およびおそらくは単一のネイティブプラットフォーム上)にあり得る一方、DSEは、別個のコンピューター上にあり得る。代替的に、DSEは、発信元エンクレーブをホストするコンピューターまたは宛先エンクレーブをホストするコンピューターのいずれかと同じコンピューター上でホストされ得る。これらの分散データ密封実施形態において、データ密封および開封は、EnclaveSealおよびEnclaveUnseal抽象化プリミティブに関して上に説明されるように、単一のコンピューターに完全にはローカルではない。
[0162]分散データ密封は、抽象化プラットフォーム1914、1934、1954によってなど、抽象化層API内で実施され得る。例えば、DistributedEnclaveSealおよびDistributedEnclaveUnsealプリミティブは、上に論じられるローカルデータ密封プリミティブEnclaveSealおよびEnclaveUnsealに類似する。
DWORD
DistributedEnclaveSeal(
_In_ SEALING_POLICY sealingPolicy,
_In_reads_bytes_opt_(dwPlaintextSize)LPCVOID pPlaintext,
_In_ DWORD dwPlaintextSize,
_In_reads_bytes_opt_(dwAuthdataSize)LPCVOID pAuthdata,
_In_ DWORD dwAuthdataSize,
_Out_writes_bytes_to_(dwSealedtextSize)LPVOID pSealedtext,
_Inout_ DWORD dwSealedtextSize,
Set<EnclaveIdentity>SetOfTargetEnclaves
)
[0163]DistributedEnclaveSealは、エンクレーブ1910などの呼び出しエンクレーブが、pPlaintextパラメーターにより提供されるデータを開封する権限を与えられるエンクレーブアイデンティティのセットを特定することを可能にする追加のSetOfTargetEnclavesパラメーターをとることにより、EnclaveSealを拡張する。SetOfTargetEnclavesにより提供されるアイデンティティがない場合、デフォルトで権限を与えられたエンクレーブアイデンティティが、密封エンクレーブのアイデンティティ、例えば、密封エンクレーブのExactHashまたはInstanceHashであると仮定され得る。
[0164]DistributedEnclaveSealの実装形態は、例えば、発信元エンクレーブのコンピューター上の抽象化プラットフォーム1914の方法のように、ネットワーク1902を介してメッセージを暗号化することなどによって、DSEとのセキュア通信チャネルを確立することを含み得る。この暗号化のための鍵は、例えば、上に説明されるように、アテステーションプロセス中に生成され得るか、または、DSE1932と関連付けられた任意の公開鍵であり得る。
[0165]DistributedEnclaveSealは、追加のパラメーターKeyForData(上のDistributedEnclaveSeal関数プロトタイプでは示されない)をとることによりさらに一般化され得る。いくつかの実施形態において、データの複数のセットが、単一のエンクレーブまたは単一のエンクレーブアイデンティティのために同時に密封したままに保たれ得る。この場合、KeyForDataは、データのどのセットが密封されているかの特定を可能にする。KeyForDataは、文字列、数字、またはプロパティのセットなど、あらゆる種類のデータ識別子であり得る。いくつかの実施形態において、KeyForDataは、DistributedEnclaveSealへの入力パラメーターであり得、密封エンクレーブによって生成され得、密封エンクレーブがデータセットを命名することを効果的に可能にする。他の実施形態において、KeyForDataは、出力パラメーターであり得、ここではDSEは、データが密封されると、KeyForData識別子を生成する。
DWORD
DistributedEnclaveUnseal(
_In_reads_bytes_opt_(dwSealedtextSize)LPCVOID pSealedtext,
_In_ DWORD wSealedtextSize,
_In_reads_bytes_opt_(dwAuthdataSize)LPCVOID pAuthdata,
_In_ DWORD dwAuthdataSize,
_Out_writes_bytes_to_(dwPlaintextSize)LPCVOID pPlaintext,
_Inout_ DWORD dwPlaintextSize
Key KeyForData,
EnclaveIdentity Identity
)
[0166]DistributedEnclaveUnsealは、抽象化プラットフォーム1954内で実施され得、宛先エンクレーブ1952からのリクエストに応答して動作し得る。DistributedEnclaveUnsealは、例えば、しかしDSE1932への宛先エンクレーブ1952のアテステーション中に生成される鍵を用いてメッセージを暗号化すること、または宛先エンクレーブの公開鍵を用いて宛先エンクレーブに送信されるメッセージを暗号化することによって、DSE1932へのセキュア通信チャネルを確立し得る。DSEは、アテステーションによってなど、リクエスト先の(宛先)エンクレーブのアイデンティティを検証し、リクエストされた密封データを開封し、開封されたデータをリクエスト先のエンクレーブにセキュアに送信し得る。リクエスト先のエンクレーブが複数のアイデンティティを有する実施形態において、特定のアイデンティティは、アイデンティティパラメーター内で特定され得る。複数のエンクレーブデータセットが単一のエンクレーブアイデンティティのために格納される実施形態において、KeyForDataパラメーターは、データセットが密封されたときにDistributedEnclaveSealで使用された同じKeyForData値を使用することによって、どの密封データセット(特定されたアイデンティティのための)がリクエストされるかを特定し得る。
[0167]いくつかの実施形態において、データを開封する権限を与えられるエンクレーブのアイデンティティは、標的とする権限を与えられた標的とするエンクレーブの公開鍵によって特定され得る(SetOfTargetEnclavesパラメーター内など)。この実施形態において、DSEへの宛先エンクレーブのアテステーションは、必要ではない場合があるが、開封されたデータは、その後、特定された公開鍵のうちの1つを使用して暗号化される際にのみ提供され得る。標的とされたエンクレーブのみが復号するための対応するプライベート鍵を有すると仮定すると、標的とされたエンクレーブのみが、開封されたデータへのアクセスを有することになる。
[0168]図19には描かれていない実施形態において、分散密封エンクレーブ(DSE)1932の機能は、それ自体が、複数のDSEにわたって分散され得る。例えば、DSE機能性は、冗長性およびフォールトトレランスのために、複数のコンピューター上の複数のDSEにわたって分散され得る。この例では、任意の複製DSEは、密封または開封リクエストをサービスすることができる場合がある。密封データ1938は、一旦密封/暗号化されると、クラウドストレージサーバーにわたって複製されることなど、どこにでも安全に格納され得るということに留意されたい。
[0169]分散データ密封は、コンピューター間のエンクレーブ作業負荷の移動を可能にし得る。例えば、DSEによって密閉される発信元エンクレーブデータは、第1のクラウドサーバー上の発信元エンクレーブの状態データであり得、これは開封後に第2のクラウドサーバー上の宛先エンクレーブ内へロードされ得る。これは、図18に関して上に説明されるものと同様に行われ得る。セキュア動作は、発信元エンクレーブ内で実行を開始し得る。その後、おそらくは発信元エンクレーブ内での実行が中断された後、発信元エンクレーブの状態は、DSEへ密封され、次いで、宛先エンクレーブが、発信元エンクレーブにおいて開始されたセキュア動作を継続する準備が整ったときに、宛先エンクレーブへ開封され得る。
[0170]図20は、密封エンクレーブまたはDSEによって実施され得るような分散データ密封および開封のための例示的なフローチャートである。ボックス2002〜2006は分散データ密封に対応する一方、ボックス2008〜2010は、分散データ開封に対応する。発信元エンクレーブから生じるエンクレーブデータセットを密封するためのリクエストに応答して、密封エンクレーブ(またはDSE)は、ボックス2002において、アテステーションレポートまたはクォートを発信元エンクレーブに送信することによって、発信元エンクレーブに対して自らを証明し得る。発信元エンクレーブは、密封エンクレーブのアテステーションレポート内のアイデンティティ値および署名を調査することによって、密封エンクレーブのアイデンティティを、本物かつ信頼できる密封エンクレーブとして検証し得る。ボックス2004において、密封エンクレーブは、許可されたリストおよび密封されるべきエンクレーブデータを受信する。これらは、図19に関して上に説明されるようにセキュアチャネルを介して受信され得る。任意選択のボックス2006において、密封エンクレーブは、例えば、データが、コンピューターファイルシステム内など密封エンクレーブのセキュアコンテナの外側に格納される場合、発信元エンクレーブのデータを自らに密封し得る。宛先エンクレーブのためのデータを開封するために、宛先エンクレーブは、ボックス2008において、アテステーションレポートまたはクォートを提供することなどによって、密封エンクレーブに対して自らを証明し得る。ボックス2010において、宛先エンクレーブのアイデンティティは、宛先エンクレーブのアテステーションレポートを調査することなどによって、検証され得る。ボックス2012において、密封エンクレーブは、宛先エンクレーブの認証されたアイデンティティがデータと一緒に受信される許可リスト内に含まれることを検証することによって、宛先エンクレーブが発信元エンクレーブからのデータを開封することを許可されているかどうかを決定する。一旦許可が確認されると、エンクレーブデータは、ボックス2014において、それが密封された場合には開封され、次いで、セキュアチャネルを介して宛先エンクレーブに送信され得る。
Key Vaultエンクレーブ
[0171]Key Vaultは、エンクレーブと共に実施され得る。Key Vaultは、データを暗号化し復号するための暗号化システムの鍵などの鍵を、Key Vaultのクライアントのためにセキュアに保持する。Key Vaultは、追加的に、データを暗号化し復号すること、データに署名すること、および既存の鍵から新しい鍵を導出することなど、鍵を用いた動作を実施し得る。Key Vaultは、エンクレーブとして実施されるとき、秘密暗号化鍵の非常にセキュアな記憶装置および秘密暗号化鍵を用いた処理を提供し得る。加えて、Key Vaultエンクレーブのソフトウェアアテステーションは、Vaultクライアントが本物かつ信頼できるKey Vaultと通信しているというVaultクライアントへの高いレベルの確証を提供し得る。高度にセキュアなシステムは、Vaultロックされた鍵を用いてKey Vaultエンクレーブ上に構築され得、それによりKey Vaultの内側に格納される鍵は、Key Vaultの外側のいかなるクライアントにも決して解放されず、また、いくつかの場合において、Vaultロックされた鍵は、Key Vaultエンクレーブの内側に格納される(またはおそらくはそれに密閉される)場合にしか存在することができない。
[0172]図21は、例示的なKey Vaultエンクレーブのブロック図である。エンクレーブ2122は、第2のネイティブエンクレーブプラットフォーム2126のセキュアエンクレーブコンテナの内側のKey Vaultである。図21の例では、Key Vaultエンクレーブ2122のクライアント2112もエンクレーブであり、第1のネイティブエンクレーブプラットフォーム2116のセキュアエンクレーブコンテナの内側でホストされる。エンクレーブ2112、2122は、それらのそれぞれのネイティブプラットフォーム2116、2126と、それぞれのエンクレーブ抽象化プラットフォーム2114、2124を介して相互作用し得る。他の実施形態において、一方または両方の抽象化プラットフォーム2114、2124は、エンクレーブ2112および/または2122がネイティブプラットフォーム2116、2126と直接的に相互作用する場合には存在しない場合がある。
[0173]Key Vaultエンクレーブ2122は、通信チャネル2150を介してVaultクライアント2112と通信し得る。いくつかの実施形態において、通信チャネル2112は、通信チャネル2150を介して送信されるメッセージの機密性、完全性、および/または新鮮性の確証を提供するセキュア通信チャネルであり得る。そのようなセキュア通信チャネルの機密性および完全性は、図5および図6にあるように、アテステーションプロセスの部分として生成される共有鍵を使用して、図2および図3にあるように、例えば、暗号化および署名により確立され得る。
[0174]ソフトウェアアテステーションは、部分的に、他のサイズの通信チャネル上のエンティティのアイデンティティの確証を提供することによってセキュリティを提供する。Key Vaultエンクレーブ2122をVaultクライアントに証明することによって、クライアントは、鍵または他のクリアテキストデータなどの秘密をKey Vaultに送信する前に、エンクレーブ2122が自ら語る通りのものであるという確証を得ることができる。図21に描写されるように、エンクレーブでもあるクライアントの場合は、逆もまた然りである。Vaultエンクレーブ2112をKey Vaultエンクレーブ2122に証明することによって、Key Vaultは、鍵または他のクリアテキストデータなどの秘密をクライアントに明らかにする前に、クライアントが自ら語る通りのものであるという確証を得ることができる。
[0175]Vaultロックされた鍵および導出された鍵を用いたKey Vaultシステムは、特に暗号化鍵がVaultロックされた鍵から導出される場合、柔軟でありセキュアな状態を変化させるセキュリティシステムを構築するために使用され得る。公開である場合とそうでない場合とがある鍵導出関数は、第1の鍵から複数の鍵を生成するために使用され得る。第1の鍵(ルート秘密)は、最高レベルのセキュリティのためにVaultロックされ得、第1の鍵から導出される鍵は、暗号化目的のために使用され得る。導出鍵が不正アクセスされる場合、第1の鍵を保持するKey Vaultにアクセスするまたはそれを変化させる必要なく、新しい導出鍵が既存のシステム内で生成され得る。
[0176]例示的なKey Vaultエンクレーブ(KVE)は、エンクレーブを使用して鍵ストレージ、生成、導出、分散、暗号化、復号、および署名を提供するクラウドベースのKey Vaultシステムである。KVEは、その正確なハッシュ(そのセキュアコンテナのコンテンツのハッシュ)によって、またはその作成者によって指定されるかもしくはそれと関連付けられる任意の識別子によって、識別され得る。後者の場合、エンクレーブは、識別子の衝突に起因するクラッシュおよびセキュリティ違反を避けるために、その作成者のプライベート鍵を用いて署名され得る。
[0177]Key Vaultクライアントは、以下の例示的なプリミティブを使用してKey Vaultシステムと相互作用し得る。例示的なStoreKey関数プロトタイプは、StoreKey([in]Keyname,[in]KeyType,[in]KeyValue,[in]Policy)である。StoreKeyは、Key Vault内に所与の鍵を格納し、それを所与の名前と関連付ける。鍵タイプはまた、鍵と関連付けられ、その鍵を用いて行われ得ることを制限する。例えば、いくつかの鍵は、暗号化のためだけに使用されるべきであり、他のものは署名などのために使用されるべきである。また、特定の鍵は、特定の暗号アルゴリズムとのみ使用され得る。ポリシーは、鍵の使用をさらに制限するためにポリシーを特定し得る。例えば、ポリシーは、鍵を取得するおよび/または鍵を使用することが許可されるエンクレーブアイデンティティのセットを特定し得る。ポリシーはまた、例えば、鍵が特定の日時に破壊されるべきである、または鍵を使用した動作の速度が制限されるべきであるという時間的特性を特定し得る。
[0178]例示的なGenerateKey関数プロトタイプは、GenerateKey([in]keyName,[in]keyType,[in]Policy)である。
[0179]GenerateKeyは、特定のタイプの新しい鍵を生成し、それをKey Vaultの内側に格納されたままにする、すなわち、鍵はKey Vaultを決して離れない。
[0180]例示的なGetKey関数プロトタイプは、GetKey([in]KeyName,[out]KeyValue)である。
[0181]GetKeyは、Key Vaultの内側に格納される鍵をフェッチする。これらのプリミティブは、典型的には、セキュア通信チャネルを介して実施され、プリミティブを呼び出すコードは、典型的には、信頼できる環境内で実行する。そのようなコンテキストにおいて、多くの場合、Key Vaultから鍵を取得することは認められている。
[0182]例示的なDeleteKey関数プロトタイプは、DeleteKey([in]keyName)である。
[0183]DeleteKeyは、Key Vaultから鍵を消去する。
[0184]例示的なDeriveKey関数プロトタイプは、DeriveKey([in]newKeyName,[in]KeyName,[in]kdfIdentifier,[in]AdditionalData)である。
[0185]DeriveKeyは、keyNameによって識別される鍵およびAdditionalData内で引き渡されるデータに基づいて新しい鍵を導出するために、kdfIdentifierによって識別される暗号化鍵導出関数(KDF)を使用する。
[0186]例示的なEncrypt関数プロトタイプは、Encrypt([in]KeyName,[in]algorithm,[in]data,[out]encryptedData)である。
[0187]Encryptは、リクエストされたアルゴリズムを使用して、KeyNameによって識別される鍵を用いてデータを暗号化する。
[0188]例示的なDecrypt関数プロトタイプは、Decrypt([in]KeyName,[in]algorithm,[in]encrytedData,[out]data)である。
[0189]Decryptは、リクエストされたアルゴリズムを使用して、KeyNameによって識別される鍵を用いてデータを復号する。
[0190]例示的なSign関数プロトタイプは、Sign([in]KeyName,[in]algorithm,[in]data,[out]signature)である。
[0191]Signは、リクエストされたアルゴリズムを使用して、KeyNameによって識別される鍵を用いてデータに署名する。
[0192]例示的なVerifySignature関数プロトタイプは、VerifySignature([in]KeyName,[in]algorithm,[in]signature,[out}bool signatureIsCorrect)である。
[0193]VerifySignatureは、リクエストされたアルゴリズムを使用して、KeyNameによって識別される鍵を用いて署名を検証する。
[0194]上のKey Vaultプリミティブのすべては、KVEによりセキュアチャネルを確立することによって実施され得る。チャネルは、図5および図6に関して上に説明されるように、アテステーションを使用し、ディフィー・ヘルマン鍵交換を実施して確立され得る。通信チャネルが確立された後、リクエストは、チャネルを介してセキュアに送信され、応答は、チャネルから読み込まれ得る。チャネルは、交換されるデータの機密性および完全性の保証を提供し得る。
[0195]別の実施形態において、最初にKVEが実行するとき、KVEは、公開/プライベート鍵ペアを生成し、またKVEは、公開鍵のためのクォートを生成する。次いで、KVEは、クォートおよび公開鍵を書き出す一方で、プライベート鍵をエンクレーブの内側に保つ。公開鍵およびクォートは、次いで、Key Vaultを使用することを望むすべてのシステム/コードへ分散され得る。この場合、上のプリミティブの実装形態は、クォートが本物のKVEとやりとりしていることを確かめるためにクォートを検証し、次いで、KVEの公開鍵を使用してリクエストを暗号化する。リクエストの部分として、プリミティブの実装形態は、KVEから送信される結果を暗号化し完全性保護するための鍵を含み得る。この実施形態は、アテステーションなしでセキュアな双方向通信チャネルを提供し得る。
[0196]図22は、いくつかのKey Vaultエンクレーブ動作の例示的なフローチャートである。プロセス2200は、ボックス2202において、Key Vaultエンクレーブ内で、暗号化システムにおいて使用される鍵をセキュアに格納することにより開始する。鍵は、例えば、データを暗号化もしくは復号し、暗号化署名を生成するために使用され得るか、または他の鍵を導出するためのルート鍵としてのみ使用され得る。鍵は、例えば、エンクレーブのセキュアコンテナのメモリ空間内に鍵を格納することによって、Key Vaultエンクレーブにセキュアに格納され得る。他の実施形態において、鍵は、鍵データをKey Vaultエンクレーブへ密封することによってセキュアエンクレーブコンテナの外側にセキュアに保たれ得るか、または、図19および図20に関して説明されるように、分散密封エンクレーブによりリモートで密封することによってセキュアに保たれ得る。
[0197]ボックス2204において、Key Vaultエンクレーブは、Vaultクライアントに対してVaultエンクレーブのアイデンティティを証明するためのアテステーションプロセスを実施する。これは、Key Vaultがなりすましではなく、暗号化されるべき鍵またはデータなどの秘密により信頼され得るという確証をクライアントに与え得る。Key Vaultエンクレーブのアテステーションは、Vaultクライアントに、Key Vaultエンクレーブのアテステーションレポートまたはアテステーションクォートを送信することを含み得る。Key Vaultクライアントは、次いで、Key Vaultエンクレーブのネイティブエンクレーブプラットフォームと関連付けられた公開鍵を用いてアテステーションレポート内の署名を検証することによって、アテステーションレポートの完全性を検証することができる。例えば、Key Vault2122のアテステーションレポートは、第2のネイティブプラットフォーム2126によって生成され得、Vaultクライアント2112は、第2のネイティブプラットフォーム2126と関連付けられた公開鍵を使用してレポート内の署名を検証し得る。このアテステーションプロセスはまた、例えば、図5および図6に示されるように、VaultクライアントとKey Vaultエンクレーブとの間のセキュア通信チャネルのために使用される鍵を生成し得る。アテステーションレポートは、例えば図14および図15に関して上に説明されるような様々なやり方で決定され得るKey Vaultエンクレーブのアイデンティティを含み得る。アイデンティティは、例えば、Key Vaultエンクレーブのセキュアコンテナの全コンテンツのハッシュ、Key Vaultエンクレーブのオーサー/作成者によって指定される固有識別子のみのハッシュ、またはコンテナのコンテンツの一部分および固有識別子の組合せのハッシュに基づき得る。
[0198]いくつかのKey Vaultエンクレーブ動作はまた、Vaultクライアントのアイデンティティの確証を必要とし得る。例えば、データを復号することまたは鍵を漏らすこと(DecryptまたはGetKeyプリミティブなどにより)は、そのような確証を必要とし得る。これらの状況において、Vaultクライアントもエンクレーブである場合、任意選択のボックス2208は、Key Vaultエンクレーブによって、Vaultクライアントのアイデンティティを検証するためのアテステーションプロセスを含む。ボックス2208のアテステーションプロセスは、Key Vaultエンクレーブにおいて、Vaultクライアントのアテステーションレポートまたはクォートを受信することを含み得る。
[0199]任意選択のボックス2210において、セキュア通信チャネルが、Key VaultとKey Vaultエンクレーブとの間で確立され得る。セキュアな通信は、VaultクライアントとKey Vaultエンクレーブとの間で、暗号化されるべき鍵またはデータなどの秘密を引き渡すことが必要とされ得る。ボックス2004または2008のアテステーションプロセスは、例えば、図5および図6に示されるように、VaultクライアントとKey Vaultエンクレーブとの間にセキュア通信チャネルを作成するために使用され得る鍵を生成し得る。代替的に、メッセージの宛先の任意の知られている公開鍵が、メッセージをセキュアに送信するために使用され得る。
[0200]ボックス2212において、上に説明されるKey Vaultプリミティブのうちの1つなどの鍵動作が、Key Vaultエンクレーブの内側で実施され得る。この動作中、鍵データは、Key Vaultエンクレーブのセキュアコンテナのアドレス空間にのみ格納され得る。例示的なプリミティブとしては、DeriveKey、Decrypt、Signなどが挙げられる。
[0201]プロセス2200は、Key Vaultエンクレーブが鍵を既に知っていると仮定する。StoreKeyまたはGenerateKeyなどのいくつかのKey Vaultエンクレーブ動作またはプリミティブの場合、動作の順序は、プロセス2200において描写されるものとは異なり得ることに留意されたい。例えば、GenerateKeyの場合、鍵生成動作(ボックス2212にあるような)は、ボックス2202の安全な格納動作の前に発生することになる。そのような動作順序は、図23のボックス2302〜2308に描写される。
[0202]図23は、Vaultロックされた鍵を用いたKey Vaultエンクレーブを作成および使用するための例示的なフローチャートである。プロセス2300のボックス2302〜2308において、新しい鍵がKey Vaultエンクレーブ内で導出される。ボックス2310〜2316において、新しく導出された鍵は、復号動作を実施するために使用される。これは、Vaultロックされた鍵の例示的な使用であり、それにより、すべての鍵動作は、Key Vaultエンクレーブを用いて実施され、鍵は、Vaultクライアントに決して提供されない。さらに、この例における新しい鍵は、それがKey Vaultエンクレーブ自体の中で作成(導出)されたために、Key Vaultエンクレーブの外側には決して存在することができず、また、Vaultクライアントまたは他の場所からKey Vaultエンクレーブに決して提供されない。いくつかの実施形態および鍵使用ポリシーでは、Vaultロックされた鍵は、Key Vaultエンクレーブへ鍵を密封した後にさえ、Key Vaultエンクレーブのセキュアコンテナを決して離れないという点で一過性であり得る。通信チャネルを一時的にセキュアにするために使用される導出鍵と一緒に発生し得るなど、そのような一過性の鍵は、Key Vaultエンクレーブのコンテナが破壊または終了されるときにはどこにも存在しなくなり得る。図23のプロセスは、Vaultロックされた鍵がどのように使用され得るかを例証する一方、図23のプロセスは、例えば、鍵使用ポリシーが、鍵がその作成をリクエストしたクライアントへ戻ることを許可した場合、Vaultロックされない鍵と共に使用され得る。
[0203]ボックス2302において、Key Vaultエンクレーブは、Vaultクライアントに対して自らを証明する。これは、クライアントがボックス2312において暗号化されるべき秘密を提供することから、クライアントによって要求され得る。ボックス2304において、Key Vaultエンクレーブは、例えば、Vaultクライアントから、鍵使用ポリシーの標示を受信し得る。標示は、例えば、ポリシーを特定するデータ構造であり得るか、または、鍵使用ポリシーのレジストリーと共に使用されるべき識別子であり得る。鍵使用ポリシー自体は、この鍵がいかなるVaultクライアントにも提供されるべきではないことを示し得る。ボックス2306において、新しい鍵が、以前に知られているルート鍵から、例えば、上に説明されるDeriveKeyプリミティブにより、導出される。新しい鍵を導出するためのリクエスト(描写されない)は、例えば、Vaultクライアントから、Key Vaultエンクレーブによって受信され得る。ボックス2308において、新しく導出された鍵は、受信した鍵使用ポリシーに従ってセキュアに格納され得る。
[0204]Vaultクライアントは、ボックス2310において、Key Vaultエンクレーブに対して自らを証明し得る。アテステーションプロセスは、Key Vaultエンクレーブにおいて、Vaultクライアントのアテステーションレポートまたはクォートを受信することを含み得る。受信した鍵使用ポリシーは、新しい鍵の一部またはすべての使用を、ソフトウェアアテステーションにより認証されるリクエスト元からのリクエストに制限し得る。ボックス2312〜2316において、上のDecryptプリミティブなどの復号動作は、ボックス2306において、導出される鍵を使用して実施される。他の実施形態において、暗号化、署名、署名を検証すること、およびボックス2306において導出される鍵から別の新しい鍵を導出すること(ルート鍵から第2の生成鍵を導出すること)など、他の動作が、Vaultロックされた鍵を用いて実施され得る。ボックス2312において、暗号化されたデータバッファが、Vaultクライアントから受信される。受信した暗号化データは、ボックス1314において、導出鍵を用いて復号され、結果として生じる復号されたデータ(復号されたデータバッファ内の)は、ボックス2316において、セキュア通信チャネルを介してVaultクライアントに送信される。
[0205]一実施形態において、エンクレーブデータを密封するための方法は、
[0206]第1のネイティブエンクレーブプラットフォーム上でホストされる発信元エンクレーブに、第2のネイティブエンクレーブプラットフォーム上でホストされる密封エンクレーブの第1のアテステーションレポートを送信するステップと、
[0207] 発信元エンクレーブから許可リストおよび関連エンクレーブデータを受信するステップであって、許可リストが、エンクレーブデータを開封することを許可される1つまたは複数のエンクレーブアイデンティティのリストを含む、ステップと、
[0208]エンクレーブデータおよび許可リストをセキュアに格納するステップと、
[0209]許可リストに従って許可される権限を与えられたアイデンティティを有するエンクレーブにエンクレーブデータのアクセスを制限するステップと、を含む。
[0210]一実施形態において、第1のネイティブエンクレーブプラットフォームは、第1のコンピューター上であり、第2のエンクレーブネイティブプラットフォームは、第2のコンピューター上でホストされる。
[0211]一実施形態において、許可リストは、抽象アイデンティティタイプのリストであり、
[0212]発信元エンクレーブの発信元アテステーションレポートを受信するステップと、
[0213]発信元アテステーションレポートおよび許可リスト内の抽象アイデンティティタイプから、許可されたアイデンティティ値を導出するステップと、をさらに含む。
[0214]一実施形態において、受信したエンクレーブデータは暗号化され、
[0215]発信元エンクレーブと密封エンクレーブとの間のアテステーションプロセスを実行するステップと、
[0216]アテステーションプロセス中に生成される鍵を用いて、暗号化されたエンクレーブデータを復号するステップと、をさらに含む。
[0217]一実施形態において、エンクレーブデータをセキュアに格納するステップは、
[0218]密封されたエンクレーブデータを作成するために、密封エンクレーブと関連付けられた鍵を用いてエンクレーブデータを暗号化するステップと、
[0219]密封されたエンクレーブデータを永久記憶装置に格納するステップと、
[0220]権限を与えられたアイデンティティにアクセスが許可されることを決定した後に、密封されたエンクレーブデータを復号するステップとを含む。
[0221]一実施形態において、エンクレーブデータを密封するための方法は、
[0222]第1のネイティブエンクレーブプラットフォーム上でホストされる発信元エンクレーブにおいて、第2のネイティブエンクレーブプラットフォーム上でホストされる密封エンクレーブの第1のアテステーションレポートを受信するステップと、
[0223]密封エンクレーブにおける信頼を検証するステップと、
[0224]許可リストおよび関連エンクレーブデータを密封エンクレーブに送信するステップであって、許可リストが、エンクレーブデータを開封することを許可される1つまたは複数のエンクレーブアイデンティティのリストを含む、ステップとを含む。
[0225]一実施形態において、本方法は、
[0226]密封エンクレーブと発信元エンクレーブとの間のアテステーションプロセスと、
[0227]アテステーションプロセス中に生成される鍵を用いてエンクレーブデータを暗号化することによって、暗号化されたエンクレーブデータを生成するステップとをさらに含み、
[0228]密封エンクレーブに送信されるエンクレーブデータは、暗号化されたエンクレーブデータである。
[0229]一実施形態において、第1のネイティブエンクレーブプラットフォームは、第1のコンピューター上であり、第2のエンクレーブネイティブプラットフォームは、第2のコンピューター上でホストされる。
[0230]一実施形態において、許可リストは、抽象アイデンティティタイプのリストであり、
[0231]発信元エンクレーブの発信元アテステーションレポートを密封エンクレーブに送信するステップであって、発信元アテステーションレポートが、許可リスト内の抽象アイデンティティタイプに対応する発信元エンクレーブの少なくとも1つのアイデンティティ値を含む、ステップをさらに含む。
[0232]一実施形態において、本方法は、
[0233]発信元エンクレーブ内でセキュアな処理動作を部分的に完了するステップをさらに含み、
[0234]エンクレーブデータが、部分的に完了されたセキュアな処理動作を継続することを別のエンクレーブインスタンス化に許可するのに十分な発信元エンクレーブの状態データを含む。
[0235]一実施形態において、システムは、少なくともプロセッサーと命令を格納するメモリとを備え、命令は、システムによって実行されるとき、少なくとも
[0236]第1のネイティブエンクレーブプラットフォーム上でホストされる発信元エンクレーブに、第2のネイティブエンクレーブプラットフォーム上でホストされる密封エンクレーブの第1のアテステーションレポートを送信することと、
[0237]発信元エンクレーブから許可リストおよび関連エンクレーブデータを受信することであって、許可リストが、エンクレーブデータを開封することを許可される1つまたは複数のエンクレーブアイデンティティのリストを含む、ことと、
[0238]エンクレーブデータおよび許可リストをセキュアに格納することと、
[0239]許可リストに従って許可される権限を与えられたアイデンティティを有するエンクレーブにエンクレーブデータのアクセスを制限することと、を引き起こす。
[0240]一実施形態において、第1のネイティブエンクレーブプラットフォームは、第1のコンピューター上であり、第2のエンクレーブネイティブプラットフォームは、第2のコンピューター上でホストされる。
[0241]一実施形態において、許可リストは、抽象アイデンティティタイプのリストであり、命令は、少なくとも
[0242]発信元エンクレーブの発信元アテステーションレポートを受信することと、
[0243]発信元アテステーションレポートおよび許可リスト内の抽象アイデンティティタイプから、許可されたアイデンティティ値を導出することと、をさらに引き起こす。
[0244]一実施形態において、受信したエンクレーブデータは暗号化され、命令は、少なくとも
[0245]発信元エンクレーブと密封エンクレーブとの間のアテステーションプロセスを実行することと、
[0246]アテステーションプロセス中に生成される鍵を用いて、暗号化されたエンクレーブデータを復号することとをさらに引き起こす。
[0247]一実施形態において、エンクレーブデータをセキュアに格納することは、
[0248]密封されたエンクレーブデータを作成するために、密封エンクレーブと関連付けられた鍵を用いてエンクレーブデータを暗号化することと、
[0249]密封されたエンクレーブデータを永久記憶装置に格納することと、
[0250]権限を与えられたアイデンティティにアクセスが許可されることを決定した後に、密封されたエンクレーブデータを復号することとを含む。
[0251]一実施形態において、システムは、少なくともプロセッサーと命令を格納するメモリとを備え、命令は、システムによって実行されるとき、少なくとも
[0252]第1のネイティブエンクレーブプラットフォーム上でホストされる発信元エンクレーブにおいて、第2のネイティブエンクレーブプラットフォーム上でホストされる密封エンクレーブの第1のアテステーションレポートを受信することと、
[0253]密封エンクレーブにおける信頼を検証することと、
[0254]許可リストおよび関連エンクレーブデータを密封エンクレーブに送信することであって、許可リストが、エンクレーブデータを開封することを許可される1つまたは複数のエンクレーブアイデンティティのリストを含む、こととを引き起こす。
[0255]一実施形態において、命令は、少なくとも
[0256]密封エンクレーブと発信元エンクレーブとの間のアテステーションプロセスと、
[0257]アテステーションプロセス中に生成される鍵を用いてエンクレーブデータを暗号化することによって、暗号化されたエンクレーブデータを生成することをさらに引き起こし、
[0258]密封エンクレーブに送信されるエンクレーブデータは、暗号化されたエンクレーブデータである。
[0259]一実施形態において、第1のネイティブエンクレーブプラットフォームは、第1のコンピューター上であり、第2のエンクレーブネイティブプラットフォームは、第2のコンピューター上でホストされる。
[0260]一実施形態において、許可リストは、抽象アイデンティティタイプのリストであり、命令は、少なくとも
[0261]発信元エンクレーブの発信元アテステーションレポートを密封エンクレーブに送信することであって、発信元アテステーションレポートが、許可リスト内の抽象アイデンティティタイプに対応する発信元エンクレーブの少なくとも1つのアイデンティティ値を含む、ことをさらに引き起こす。
[0262]一実施形態において、命令は、少なくとも
[0263]発信元エンクレーブ内でセキュアな処理動作を部分的に完了することをさらに引き起こし、
[0264]エンクレーブデータが、部分的に完了されたセキュアな処理動作を継続することを別のエンクレーブインスタンス化に許可するのに十分な発信元エンクレーブの状態データを含む。
[0265]先のセクションに説明されるプロセス、方法、およびアルゴリズムの各々は、1つまたは複数のコンピューターまたはコンピュータープロセッサーによって実行されるコードモジュールに埋め込まれ得、またこれらによって完全にまたは部分的に自動化され得る。コードモジュールは、ハードドライブ、固体メモリ、光学ディスク、および/または同様のものなどの任意のタイプの非一時的なコンピューター可読媒体またはコンピューター記憶デバイス上に格納され得る。プロセスおよびアルゴリズムは、特定用途向け回路内で部分的または全体的に実施され得る。開示されたプロセスおよびプロセスステップの結果は、揮発性または不揮発性記憶装置などの任意のタイプの非一時的なコンピューター記憶装置に格納され得る。上に説明される様々な特徴およびプロセスは、互いとは無関係に使用され得るか、または様々なやり方で組み合わせられ得る。すべての潜在的な組合せおよび部分的組合せは、本開示の範囲内に入ることが意図される。加えて、特定の方法またはプロセスブロックは、いくつかの実装形態においては省略され得る。本明細書に説明される方法およびプロセスはまた、いかなる特定の順序にも限定されず、それに関連するブロックまたは状態は、適切である他の順序で実施され得る。例えば、説明されたブロックまたは状態は、具体的に開示されるもの以外の順番で実施され得るか、複数のブロックまたは状態が、単一のブロックまたは状態において組み合わされ得る。例示的なブロックまたは状態は、連続して、並行して、または何らかの他の様式で実施され得る。ブロックまたは状態は、開示された例示的な実施形態に追加され得るか、またはそこから除去され得る。本明細書に説明される例示的なシステムおよびコンポーネントは、説明されるものとは異なって構成され得る。例えば、開示された例示的な実施形態と比較して、要素が追加され得る、除去され得る、または再配置され得る。
[0266]様々なアイテムは、使用されている間メモリ内または記憶装置上に格納されるものとして例証されること、ならびに、これらのアイテムまたはそれらの部分は、メモリ管理およびデータ完全性の目的のためにメモリと他の記憶デバイスとの間で転送され得るということも理解されたい。代替的に、他の実施形態において、ソフトウェアモジュールおよび/またはシステムの一部またはすべては、メモリ内または別のデバイス上で実行し得、コンピューター間通信を介して、例証されたコンピューティングシステムと通信し得る。さらには、いくつかの実施形態において、システムおよび/またはモジュールの一部またはすべては、1つまたは複数の特定用途向け集積回路(ASIC)、標準集積回路、コントローラ(例えば適切な命令を実行することにより、またマイクロコントローラおよび/または埋め込み式コントローラを含む)、フィールドプログラマブルゲートアレイ(FPGA)、複合プログラム可能論理デバイス(CPLD)などを含むがこれらに限定されないファームウェアおよび/またはハードウェア内で少なくとも部分的になど、他のやり方で実施または提供され得る。モジュール、システム、およびデータ構造の一部またはすべてはまた、適切なドライブによって、または適切な接続を介して読み込まれるべきハードディスク、メモリ、ネットワーク、またはポータブルメディア物品などのコンピューター可読媒体上に(例えば、ソフトウェア命令または構造化データとして)格納され得る。本明細書および請求項の目的のため、「コンピューター可読記憶媒体」という用語およびそのバリエーションは、波、信号、ならびに/または他の一時的および/もしくは無形の通信媒体を含まない。システム、モジュール、およびデータ構造はまた、ワイヤレスベースおよび有線/ケーブルベースの媒体を含む様々なコンピューター可読伝送媒体上で、生成されたデータ信号として(例えば、搬送波または他のアナログもしくはデジタル伝播信号の部分として)伝送され得、様々な形態(例えば、単一もしくは多重化アナログ信号の部分として、または複数の離散デジタルパケットもしくはフレームとして)をとり得る。そのようなコンピュータープログラム製品はまた、他の実施形態においては他の形態をとり得る。したがって、本開示は、他のコンピューターシステム構成で実践され得る。
[0267]本明細書中で使用される条件的言語、とりわけ「can」、「could」、「might」、「may」、「e.g」、および同様のものなどは、別途具体的に記述されない限り、または使用の際に文脈内でそれ以外に理解されない限り、一般に、特定の特徴、要素、および/またはステップを、特定の実施形態が含み、一方で他の実施形態が含まないことを伝えることが意図される。したがって、そのような条件的言語は、一般に、特徴、要素、および/またはステップが、1つもしくは複数の実施形態にいずれの形であれ必要とされること、あるいは1つもしくは複数の実施形態が、オーサー入力もしくはプロンティングを用いて、または用いずに、これらの特徴、要素、および/もしくはステップが含まれるか、または任意の特定の実施形態において実施されるべきであるかを決定するための論理を必ず含むことを示唆することは意図されない。用語「comprising(備える)」、「including(含む)」、「having(有する)」、および同様のものは、同義であり、オープンエンド式に包含的に使用され、追加の要素、特徴、行為、動作などを除外しない。また、用語「or(または)」は、例えば、要素のリストをつなぐために使用されるとき、用語「or(または」がリスト内の要素の1つ、いくつか、またはすべてを意味するように、その包含的な意味で(排他的な意味ではなく)使用される。
[0268]特定の例示的な実施形態が説明されているが、これらの実施形態は、例としてのみ提示されており、本明細書に開示される発明の範囲を限定することは意図されない。したがって、前述の説明のいずれも、任意の特定の特徴、特性、ステップ、モジュール、またはブロックが必要である、または不可欠であることを示唆することは意図されない。実際、本明細書に説明される新規の方法およびシステムは、様々な他の形態で具現化され得、さらには、本明細書に説明される方法およびシステムの形態における様々な省略、置換、および変更は、本明細書に開示される発明の趣旨から逸脱することなくなされ得る。添付の特許請求の範囲およびそれらの均等物は、本明細書に開示される発明の特定の範囲および趣旨に入るような形態または修正を網羅することが意図される。