(57)【特許請求の範囲】
【請求項１】
コンピュータにおいて、アプリケーションプログラムによって実行時に用いられるコンポーネントの完全性を保証し、および検証する方法であって、
生成するアセンブリで使用するためのデジタル署名コンポーネントにより、公開鍵と秘密鍵とを有する鍵ペアをメモリに記憶するステップと、
前記公開鍵を含むマニフェストを前記アセンブリにおいて記憶するステップと、
前記アセンブリをハッシュするステップと
前記アセンブリのハッシュを前記秘密鍵によって暗号化して、暗号化されたハッシュを求めるステップと、
当該暗号化されたハッシュを前記アセンブリのアセンブリダイジェストにおいて記憶するステップと、
ハッシュ関数により計算される前記公開鍵のトークンを含む参照する参照アセンブリのマニフェストにより、前記アセンブリを参照するステップであって、前記アセンブリは、前記参照アセンブリのマニフェストに含まれる公開鍵のトークンと、該アセンブリのマニフェストに含まれる公開鍵とを比較することによって参照されるステップと
を備えたことを特徴とする方法。
【請求項２】
前記暗号化されたハッシュを前記公開鍵により復号化し、前記アセンブリのコンテンツの実際のハッシュを決定し、および前記復号化された暗号化ハッシュを前記実際のハッシュと比較することによって、前記アセンブリの内容が変更されたか否かを決定するステップをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項３】
前記アセンブリの発行者が前記秘密鍵の所有者であるか否かを決定するステップをさらに備えたことを特徴とする請求項２に記載の方法。
【請求項４】
前記暗号化されたハッシュを前記公開鍵により復号化し、前記アセンブリのコンテンツの実際のハッシュを決定し、および前記復号化された暗号化ハッシュを前記実際のハッシュと比較することによって、前記アセンブリの内容が変更されたか否かを決定するステップをさらに備えたことを特徴とする請求項１に記載の方法。
【請求項５】
前記アセンブリの発行者が前記鍵ペアの元の所有者であるか否かを決定するステップをさらに備えたことを特徴とする請求項４に記載の方法。
【請求項６】
前記アセンブリの発行者が前記鍵ペアの元の所有者であるか否かを決定するステップは、前記公開鍵を記憶媒体に格納し、および該記憶媒体に格納された公開鍵を前記マニフェストの公開鍵と比較するステップを備えたことを特徴とする請求項５に記載の方法。
【請求項７】
アプリケーションプログラムによって実行時に用いられるコンポーネントの完全性を保証し、および検証するコンピュータのシステムであって、
公開鍵をアセンブリ内のマニフェストに提供する第１のコンポーネントと、
前記アセンブリのコンテンツを計算してハッシュを求め、前記公開鍵と合致する秘密鍵によって前記ハッシュを暗号化する第２のコンポーネントと、
ハッシュ関数を用いて、参照アセンブリのマニフェストに含まれる、前記マニフェストに関連する前記公開鍵のトークンを計算する第３のコンポーネントと、
前記アセンブリのマニフェストにある公開鍵と、前記参照アセンブリのマニフェストに含まれる公開鍵のトークンとを比較することによって、該アセンブリを参照する第４のコンポーネントと
を備えたことを特徴とするシステム。
【請求項８】
前記暗号化されたハッシュを前記公開鍵によって復号化し、復号化された暗号化ハッシュを前記アセンブリ上で実際に動作するハッシュと比較する検証コンポーネントをさらに備えたことを特徴とする請求項７に記載のシステム。
【請求項９】
鍵ペアを生成する鍵ペア生成コンポーネントをさらに備えたことを特徴とする請求項７に記載のシステム。
【請求項１０】
前記暗号化されたハッシュ値を前記公開鍵によって復号化し、および復号化された暗号化ハッシュを前記アセンブリ上で実際に動作するハッシュと比較する検証コンポーネントをさらに備えたことを特徴とする請求項７に記載のシステム。
【請求項１１】
アプリケーションプログラムによって実行時に用いられるコンポーネントの完全性を保証し、および検証するコンピュータのシステムであって、
公開鍵と秘密鍵とを有する鍵ペアを提供する手段と、
前記公開鍵を前記アセンブリのマニフェストに挿入する手段と、
前記アセンブリをハッシュする手段と、
前記アセンブリのハッシュを前記秘密鍵によって暗号化する手段と、
暗号化されたハッシュを前記アセンブリに関連付ける手段と、
前記公開鍵をハッシュする手段と、
前記アセンブリを参照する参照アセンブリのマニフェストに前記公開鍵のトークンを挿入する手段と、
前記参照アセンブリのマニフェストにある前記公開鍵のトークンと、前記アセンブリのマニフェストにある公開鍵とを比較する手段と
を備えたことを特徴とするシステム。
【請求項１２】
前記アセンブリが変更されたか否かを決定する手段をさらに備えたことを特徴とする請求項１１に記載のシステム。
【請求項１３】
前記アセンブリが変更されたか否かを決定する手段は、前記暗号化されたハッシュ値を前記公開鍵によって復号化する手段と、実際のハッシュを生成する手段と、当該生成されたハッシュを前記復号化された暗号化ハッシュと比較する手段とを含むことを特徴とする請求項１２に記載のシステム。
【請求項１４】
前記アセンブリおよび前記参照アセンブリの少なくとも一つは、動的リンクライブラリであることを特徴とする請求項１１に記載のシステム。
【発明の詳細な説明】
【０００１】
(技術分野)
本発明は、コンピュータシステムに関し、より具体的には、実行時にアプリケーションプログラムによって用いられるコンポーネントにセキュリティを提供するためのシステムおよび方法に関する。
【０００２】
(発明の背景)
従来、アプリケーションプログラムは、単一のモノリシックバイナリファイルからなっていた。アプリケーションプログラムが、コンパイラによって生成されると、次のバージョンが再コンパイルされ、出荷されるまではアプリケーションプログラムが変更されることはなかった。オペレーティングシステム、ハードウェアおよびマーケットの要望があっても、次のバージョンが実現され、再コンパイルされるまでその変更は待たされていた。今日、アプリケーションプログラムは、いくつかのコンポーネントから構成されており、加えて、これらのコンポーネントの多くは実行時にリンクされる。これらのコンポーネントには、異なるアプリケーションプログラムによって共有される動的リンクライブラリ（ＤＬＬ）およびその他のファイルが含まれる。これらのＤＬＬは、アプリケーションコンポーネントのテーブルにリストアップされ、実行時にリンクされる。オペレーティングシステムは、ローダ探索パス、アプリケーションディレクトリ、オペレーティングシステムディレクトリあるいはユーザ特有のパス中で、その動的リンクライブラリ名を探索して、ＤＬＬコードを実行メモリにロードできるようにする。これらのＤＬＬは、種々のアプリケーションプログラムによって共有することができるので、あるアプリケーションに対してＤＬＬを変更すると、他のアプリケーションのオペレーションが停止することになるかもしれない。
【０００３】
さらに、マイクロソフト（登録商標）ウィンドウズ（登録商標）オペレーティングシステムのようなオペレーティングシステム上で動作する多くのアプリケーションプログラムは、共有のオペレーティングシステムコンポーネントを利用する。現在のマイクロソフト（登録商標）ウィンドウズ（登録商標）オペレーティングシステムプラットフォームについて、システム管理者や開発者が直面する主な課題の一つは、配置されたアプリケーションの一部として動作する動的リンクライブラリおよびその他のファイルのセットを正確に制御することができないことである。一つのアプリケーションプログラムのインストールによって、ファイルが上書きされ、そのファイルに依存するその他のアプリケーションプログラムが影響を受けることは、よくあることである。しかし、マイクロソフト（登録商標）ウィンドウズ（登録商標）オペレーティングシステムには、アプリケーションが依存するファイルが何時変更されたかを検出する組込み機能はない。
【０００４】
ある状況下で、コンポーネントが変更されても、アプリケーションプログラムは、その変更の完全性が信頼でき得るものであれば、まだ実行を選択するかもしれない。例えば、コンポーネントの発行者（ｐｕｂｌｉｓｈｅｒ）が軽微なエラーを修正する場合、アプリケーションプログラムは、依然として問題なく動作することができる。また、信頼性の高い発行者によってバージョンのアップグレードが行われた場合、アプリケーションプログラムは、バージョンのグレードアップとコンポーネントの実行を要求するかもしれない。しかし、信頼できない第三者がそのコンポーネントを交換した場合、そのコードの実行によって、アプリケーションプログラムが動作している環境のソフトウェアおよびハードウェアに、ダメージを与える結果となる可能性がある。いくつかのコードは、コンポーネント名の中にバージョン情報を含む（例えば、ｆｏｏ１．ｄｌｌやｋｅｒｎｅｌ２．ｄｌｌ）。アプリケーションプログラムはこれらのコンポーネント名で呼び出しを行うため、コンポーネント名が変更されていれば、そのアプリケーションプログラムはそのオペレーションを終了し、システムに存在する古いバージョンのコンポーネントを使用するであろう。
【０００５】
コンポーネントの身元識別（ｉｄｅｎｔｉｔｙ）の部分は簡潔であり、なじみ易い文字通りの名前である（例えば、Ｍｙ４０１ｋＡｐｐ）。これらの名前は、コンポーネントが生み出されるとき、その開発者によって付与される。これらの名前は、単純名（ｓｉｍｐｌｅ  ｎａｍｅ）と呼ばれる。単純名は、一意であることが保証されず、名前が重複していた場合、実行時に衝突を回避するための何らかのツールなどは存在しない。コンポーネントのための単純名は、使用するのに簡潔で便利であり、一定の状況では十分使用できる。特に、個人の開発者や小規模の開発業者は、より洗練された命名法（ｎａｍｉｎｇ  ｓｃｈｅｍｅ）は必要ではない。しかし、開発者が、コンポーネントのために選択した名前がグローバルに一意であることを保証しなければならない場合もある。ＣＯＭにおいては、各コンポーネントに一意的なＧＵＩＤを割り当てることによって、一意性が保証される。しかし、ＧＵＩＤにはいくつかの欠陥がある。特に、それらのコンポーネントが生成されるときはＧＵＩＤは一意であっても、その後、そのＧＵＩＤを他の開発者が再使用したり、他のコードの代わりにそのコードを代用したりすることを回避することができない。
【０００６】
したがって、実行中アプリケーションプログラムにより用いられるコンポーネントの完全性を保証し、および検証するシステムおよび方法に対する当該技術におけるこれから直面する必要性がある。また、実行時のコンポーネントの完全性を検証するツールも必要である。さらに、これらのコンポーネント名の一意性を保証し、および詐称を防止する必要もある。
【０００７】
(発明の開示)
本発明は、アプリケーションプログラムが実行する間、用いられるコンポーネントまたはアセンブリ（例えば、メタデータを含むコンポーネント）の完全性の達成を容易にし、セキュリティを提供するシステムと方法に関する。本発明は、暗号化手法を用いて、コンポーネント間の関係を促進する。本発明では、デジタル署名鍵が用いられ、アセンブリは発行者の公開鍵で公開（ｐｕｂｌｉｓｈ）されるので、公開されるアセンブリ名が一意であることが保証される。これによって、更新のアセンブリ、すなわち、同一の発行者から公開することが必要な更新のアセンブリを他人が公開することを防止する。本発明は、公開されたアセンブリに関連する公開鍵と合致する秘密鍵をもつ者が唯一、オリジナルの発行者であるので、名前の一意性を保証し、および名前の詐称を防止する。公開鍵が各リファレンスに格納されているという事実により、呼び出し者（ｃａｌｌｅｒ）が実行時に結合するアセンブリが、秘密鍵を所有する同じ発行者からのものであることを保証することができる。
【０００８】
アプリケーションプログラムが、変更されたアセンブリファイルによって動作することを選択する場合も多いかもしれない。例えば、改訂の変更の構築には、ファイル中のエラーやバグを訂正するためのアセンブリファイルの修正を含めることができる。もしも軽微なバグの修正があった場合、アセンブリに元の同じ振る舞いを要求するアプリケーションプログラムは、動作しないかも知れない。さらに、アプリケーションプログラムが期待する発行者からそれらを取得することが保証される場合、大小の改訂が生じた場合、アプリケーションプログラムは、動作することを選択するかもしれない。
【０００９】
本発明の一形態では、公開鍵は、アセンブリファイルのマニフェストあるいは名前空間の一部となる。ハッシュ値はそのアセンブリの内容全体にわたって計算される。それから、ハッシュ値は、公開鍵に合致する秘密鍵を用いて暗号化される。暗号化または符号化されたコードは、アセンブリファイルの最後に格納することができる。あるいはまた、暗号化または符号化されたコードへのポインタを暗号化前にアセンブリの中のいずれかに格納することができる。それから、暗号化または符号化されたコードを、そのポインタが参照するメモリの場所に格納することができる。さらに、そのアセンブリファイルを参照するアセンブリは、それ自身のマニフェストまたは名前空間にアセンブリファイルの公開鍵のトークンを格納することができる。トークンは、公開鍵をハッシュ計算する縮小されたデータセットである。実行時において、トークンは、対象のアセンブリにある鍵と比較され、対象のアセンブリが同じ発行者からのものであるか否かを決定する。署名は、インストール時に、署名されたアセンブリのマニフェストに格納された鍵を用いて検証される。これによって、対象のアセンブリが期待される発行者からのものであることが保証される。
【００１０】
各アセンブリのマニフェストには、そのアセンブリを組み上げるファイルのリストを含む識別情報が提供される。各ファイルに関し記録された情報の一部は、マニフェストが構築された際のファイルの内容のハッシュである。ハッシュは、ファイルの内容全体に渡り計算される。マニフェストを出すコードは、通常、コンパイラまたはポストリンクツールであり、ハッシュを計算する。本発明では、このハッシュ値を計算する際、セキュアハッシュアルゴリズム（ＳＨＡ−１）を用いてもよい。しかし、本発明は、このハッシュを計算する際、種々のハッシュアルゴリズムを用いることもできる。アセンブリがグローバルアセンブリキャッシュにインストールされるとき、およびファイルがディスクからロードされるごとに、ファイルのハッシュを検証することができる。
【００１１】
本発明の一形態によると、実行時にアプリケーションプログラムによって用いることができるアセンブリの保護された名前空間を促進する方法が提供される。この方法は、公開鍵と秘密鍵を持つ鍵ペアを提供するステップと公開鍵を包含するマニフェストをアセンブリに提供するステップとを含む。次いで、アセンブリがハッシュ計算され、ハッシュは秘密鍵を用いて暗号化される。それから、暗号化されたハッシュは、アセンブリに添付される。
【００１２】
本発明の他の一形態においては、実行時にアプリケーションプログラムによって用いることができる、少なくとも一つのコンピュータ実行可能なコンポーネントを有するコンピュータ読み取り可能な媒体が提供される。コンピュータ読み取り可能な媒体は、公開鍵と、この公開鍵に合致する秘密鍵によって暗号化されたアセンブリのコンテンツのハッシュとを包むマニフェストを含むアセンブリを備える。暗号化されたハッシュがアセンブリに添付される。この媒体は、さらにネットワークを備えてもよい。
【００１３】
本発明の他の形態によると、実行時にアプリケーションプログラムによって用いることができるアセンブリの保護された名前空間を促進するためのシステムが提供される。このシステムは、公開鍵を持つアセンブリ内にマニフェストを提供するた第１のコンポーネントと、アセンブリの内容をハッシュ計算し、およびそのハッシュを公開鍵に合致する秘密鍵によって暗号化する第２のコンポーネントとを備えている。
【００１４】
本発明の他の形態は、実行時にアプリケーションプログラムによって用いることができるアセンブリの保護された名前空間を促進するためのシステムに関する。このシステムは、公開鍵と秘密鍵とを有する鍵ペアを提供するための手段、そのアセンブリをハッシュ計算するための手段、秘密鍵によってアセンブリのハッシュ値を暗号化するための手段および暗号化されたハッシュ値をそのアセンブリに関連付けるための手段を備える。
【００１５】
前述のおよび関連する目的を達成するため、本発明は、請求項に十分に記述された特徴、および特に指摘した特徴を備える。以下の説明と添付された図面は、本発明の例示された一実施形態を詳細に示す。しかし、これらの実施形態は、本発明の原理を用いることができる種々の方法のほんの数例を示したものであり、本発明は、この様な実施形態およびそれらに等価なものの全てを含むことを意図している。本発明のその他の目的、利点、および新規な特徴は、図面と共に考慮するとき、以下の発明の詳細な説明から明らかとなるであろう。
【００１６】
（本発明を実施するためのモード）
ここでは、本発明は、図面を参照して説明され、全体を通じて同じ参照番号は、同様の要素を参照するために用いられるものとする。本発明は、実行時にアプリケーションプログラムによって用いられるコンポーネントの完全性を容易に達成するためのシステムおよび方法に関連して記載される。これらのコンポーネントは、通常、動的リンクライブラリ（ＤＬＬ）であるが、また、実行時にアプリケーションプログラムにリンクされる定義ファイル、宣言ファイルおよび実行ファイルをも含む。本明細書で、アセンブリは主な発明の少なくとも一つの形態によれば、コンポーネントと定義され、このコンポーネントはメタデータを含み、メタデータは上記アセンブリを記述するか、またはあるアセンブリが依存するアセンブリを記述する。本発明は、ハッシュやデジタル署名といった暗号化技術を用いて、アプリケーションと共に使用するための安全なアセンブリを生成する。本発明は、デジタル暗号化および署名技術を使用する。本発明は、Schneier, BruceによってApplied Cryptography Second Edition: Protocols, Algorithms, and Source Code in C; New York: John Wiley & Sons, 1996に著されたように、公開鍵暗号化技術を使用し、これは、参照によって本明細書に組み込まれる。本発明は、ＳＨＡ（セキュアハッシュアルゴリズム）と呼ばれるハッシュ計算アルゴリズムに関連して、デジタル署名のためのＲＳＡ（Rivest、ShamirおよびAdlemen）公開鍵アルゴリズムを使用するが、その他の公開鍵署名スキームを用いることができる。公開鍵暗号の基本概念は、全ての開発者が、秘密鍵と公開鍵の双方を含む鍵のペアを与えられるようになっているということである。ファイルのビットを受け取り、そのビットから数の列をそのファイル内に生成することが鍵のアルゴリズムである。秘密鍵は開発者に割り当てられた一意の鍵であり、開発者はこの鍵を秘密に保持しようとする。公開鍵は、通常、他の開発者やユーザに使用できるようにされる。公開鍵は、受信されたデータファイル上のデジタル署名が真性であること（例えば、デジタル署名が秘密鍵によって生成されたこと）を検証するために用いることができる。ファイルは秘密鍵によって暗号化され、公開鍵が用いられて暗号を復号化することができる。本発明は、アセンブリファイルのＲＳＡ暗号化されたＳＨＡハッシュ、これはアセンブリ中のトップにあるが、および公開鍵、すなわちそのアセンブリの完全性を検証するためトップのアセンブリファイルのメタデータに格納された公開鍵を提供する。
【００１７】
本発明は、また、標準の公開鍵暗号化を用いて、実行時における名前の一意性および安全性の問題を解決する。鍵ペアによって守られた名前を共有名と称する。特に、あるアセンブリの開発者のみがそのアセンブリに対する秘密鍵を持ち、他のアセンブリに同一の名前が生成されないので、一意的な鍵ペアを信頼することによって共有名は、名前の一意性を保証し、および他の開発者がその名前空間を奪取することを防止する。
【００１８】
図１は、アセンブリと本発明に基づくデジタル署名による暗号の使用との関係を示す。第１のアセンブリ１０は、トップのアセンブリ１２およびモジュール１４を含む。トップのアセンブリは、第１のアセンブリ１０に関する情報を含み、第１のアセンブリ１０中にメタデータセクション１６が提供される。メタデータセクション１６は、識別情報コンポーネント１７およびファイル妥当性検証ダイジェストコンポーネント１８を含む。識別情報コンポーネント１７は、第１のアセンブリ１０に関する情報を含むのに対し、ファイル妥当性検証ダイジェストコンポーネント１８は、モジュール１４に関する情報を含む。識別情報コンポーネント１７は、第１のアセンブリ１０に関する多くのタイプの情報に加え、公開情報、公開鍵、バージョン情報、オペレーティングシステム情報を含むことができる。公開鍵は、実行時に検証することができるアセンブリの名前の一部を形成する。ファイル妥当性検証ダイジェストコンポーネント１８は、モジュール１４のハッシュ値を含んでもよい。識別情報コンポーネント１７およびファイル妥当性検証ダイジェストコンポーネント１８の情報は、実行前または実行時に用いられ、そのアセンブリが変更されなかったことを検証することができる。アセンブリダイジェスト１９は、トップのアセンブリ１２の最後に提供される。トップのアセンブリダイジェスト１９は、トップのアセンブリ１５の内容のハッシュ値を含むかも知れない。トップのアセンブリのハッシュ値は、識別情報コンポーネント１７におかれた公開鍵に合致する秘密鍵を用いて暗号化される。暗号化されたハッシュ値は、トップのアセンブリ１２の内容が変更されなかったことを検証するために用いることができるのに対し、ファイル妥当性検証ダイジェストコンポーネント１８にあるハッシュ値は、モジュール１４が変更されなかったことを検証するために用いることができる。
【００１９】
大抵のアプリケーションプログラムが、数個のアセンブリを備え、そのうちのいくつかは、実行中に他のアセンブリを参照することが理解されよう。したがって、図１は、第１のアセンブリ１０に依存し、または、これを参照する第２のアセンブリ２０が設けられていることをも示す。第２のアセンブリ２０には、第２のアセンブリ２０に関する情報と、さらに実行の間に参照する第１のアセンブリ１０に関する情報も含まれ、メタデータセクション２２が提供される。メタデータセクション２２は、識別情報コンポーネント２４および公開鍵トークンダイジェストコンポーネント２６を含む。識別情報コンポーネント２４は、第２のアセンブリ２０に関する情報を含むのに対し、参照用の妥当性検証ダイジェストコンポーネント２６は、第１のアセンブリに関する情報を含む。識別情報コンポーネント２４は、第２のアセンブリ２０に関する多くのタイプの情報に加え、公開情報、公開鍵、バージョン情報、オペレーティングシステム情報を含むことができる。
【００２０】
公開鍵トークンダイジェストコンポーネント２６は、第１のアセンブリ１０の公開鍵の縮小されたハッシュ値を含む。通常、セキュアハッシュアルゴリズム（ｓｈａ−１）を用いるハッシュ値は１６０ビットワードである。本発明は、ハッシュ値の最初の６４ビットあるいは８バイトを用いて、第２のアセンブリ２０に格納された公開鍵トークンに合致する第１のアセンブリ１０の公開鍵を検証する。公開鍵トークンダイジェストコンポーネント２６の情報を実行前または実行時に用いて、第２のアセンブリ２０が望む発行者（例えば、秘密鍵の所有者）から来たことが検証される。したがって、情報コンポーネント１７にある公開鍵の最初の６４ビットが、公開鍵トークンダイジェストコンポーネント２６の公開鍵トークンに合致する場合、あるレベルの確実度で、第１のアセンブリ１０が、公開鍵に合致する秘密鍵の所有者から来る。
【００２１】
図２は、本発明によるアセンブリの構成をより詳細に示す。アセンブリ３０は、トップのアセンブリ４０、第１のモジュール４５および第２のモジュール５０を備える。トップのアセンブリ４０は、アセンブリマニフェストと呼ばれるメタデータセクション４２を含む。アセンブリマニフェスト４２は、次のような識別情報を含む：公開鍵、メジャーバージョン、マイナーバージョン、改訂（ｒｅｖｉｓｉｏｎ）、組み立ておよびモジュール情報。その他の情報は、識別情報（例えば、オペレーティングシステム、ロケール）に置くことができる。モジュール情報は、アセンブリ３０を組み上げるモジュールおよび各モジュールのファイル内容のハッシュのリストである。実行前あるいは実行時に、ファイルのハッシュとモジュールのハッシュとを、同一のハッシュアルゴリズムを用いて第１のモジュール４５および第２のモジュール５０に対して照合し、アセンブリ３０の完全性を判定する。トップのアセンブリ４０には、トップのアセンブリのハッシュ４３が含まれ、ファイルの最後尾に置かれる。トップのアセンブリのハッシュは、秘密鍵によって暗号化され、秘密鍵は、開発者の識別情報にある公開鍵と合致する。識別情報の中の公開鍵を用いて、暗号化されたトップのアセンブリのハッシュ４３をハッシュに復号することができる。このハッシュは、ファイルコンテンツの内容の残りの実際のハッシュと比較することができる。次いで、トップのアセンブリ４０中で、権限のないソースによって変更がなされたか否かを判定する。アセンブリ３０が変更された場合、アセンブリ３０を呼び出すアプリケーションプログラムは自動中断を選択することができる。
【００２２】
図３は、本発明にしたがってより詳細に、アセンブリ、すなわち、その他のアセンブリを参照するアセンブリの構成を示す。参照アセンブリ７０は、アセンブリＢと付されている。第１の参照されるアセンブリ８０は、アセンブリＣと付され、第２の参照されるアセンブリ９０はアセンブリＤと付されている。参照するアセンブリ７０は、アセンブリマニフェスト７２を含み、アセンブリマニフェストは図２記載されたトップのアセンブリ４０の識別情報と類似した識別情報をもつ。アセンブリマニフェスト７２は、また、依存関係情報を含み、依存関係情報はアセンブリのリストを含み、参照するアセンブリ７０が、実行の間、このアセンブリリストに依存する。このアセンブリのリストは、また、各アセンブリのための公開鍵トークを含むが、これは、参照されるアセンブリのマニフェストにある縮小されたハッシュ値である。第１の参照されるアセンブリ８０は、同一性および依存関係の双方の情報を含むアセンブリマニフェスト８２およびアセンブリダイジェスト８３を有する。依存関係情報があることから、アプリケーションプログラムは、第１の参照されるアセンブリ８０もまた、他のアセンブリの少なくとも一つ（図示せず）からぶら下がっていることが分かる。第１の参照されるアセンブリ８０は、いずれのモジュールも有さず、したがって識別情報は、いずれのモジュールのハッシュ値も含まない。
【００２３】
第２の参照されるアセンブリ９０は、識別情報を含むアセンブリマニフェスト９４を有するが、いずれの依存関係情報も有さない。したがって、第２の参照されるアセンブリ９０は、実行するための如何なる他のアセンブリにも依存しない。第２の参照されるアセンブリ９０は、トップのアセンブリ９２、第１のモジュール９４および第２のモジュール９８を有する。識別情報は、アセンブリ９０のモジュールおよび各モジュールのコンテンツ内容全体のハッシュ値のリストを含む。トップのアセンブリ９２の最後尾には、アセンブリダイジェスト９５が提供される。アセンブリダイジェストは、トップのアセンブリ９２のファイルコンテンツの残りのハッシュ値を含む。ハッシュ値は、アセンブリの作成者の秘密鍵によって暗号化される。アセンブリマニフェスト９４にある秘密鍵および公開鍵は、一意の数学的関係を有する鍵ペアを形成する。アセンブリ７０、８０および９０のコンテンツ全体は、実行時にコンピュータシステムのキャッシュにロードされ、参照するアセンブリにある公開鍵トークンは、参照されるアセンブリにある公開鍵を検証するため用いることができる。アセンブリダイジェストの暗号化されたハッシュ値は、アセンブリマニフェストにある公開鍵を用いて復号化することができ、次いで、トップのアセンブリに渡るハッシュ値と比較して、アセンブリが不当に変更されなかったことを検証することができる。
【００２４】
図４および以下の議論によって、本発明を実施するのに適したコンピューティング環境の簡潔で一般的な説明を行う。本発明は、パーソナルコンピュータまたはサーバコンピュータ上で動作するコンピュータプログラムのコンピュータ実行可能な命令の一般的コンテキストで表現されるであろうが、また一方、その他のプログラムモジュールとの組み合わせでも実施することできることを本技術分野の当業者は理解するであろう。一般的に、プログラムモジュールは、特定のタスクを実行し、あるいは特定の抽象データタイプを実現するルーチン、プログラム、コンポーネント、データ構造その他を含む。さらに、本発明は、その他の、単一またはマルチプロセッサコンピュータシステム、ミニコンピュータ、メインフレームコンピュータ、ハンドヘルドコンピューティング機器、マイクロプロセッサベースまたはプログラム可能なコンシューマ電子機器などを含むコンピュータシステム構成によって実施することができることを本技術分野の当業者は理解するであろう。本発明の例示された形態は、また、分散コンピューティング環境でも実施され、ここでは、タスクが通信ネットワークを介して接続されるリモート処理機器よって実行される。しかし、本発明のいくつかの形態は、スタンドアローンコンピュータ上で実施することができる。分散コンピューティング環境では、プログラムモジュールは、ローカルおよびリモートの双方のメモリ記憶機器に位置させることができる。
【００２５】
図４を参照すると、本発明を実施するための例示のシステムは、従来のパーソナルコンピュータまたはサーバコンピュータ１２０を含み、パーソナルコンピュータまたはサーバコンピュータ１２０は、処理ユニット１２１、システムメモリ１２２およびシステムバス１２３を含む。システムバス１２３は、システムメモリ１２２を含む種々のシステムコンポーネントを処理ユニット１２１に結合する。処理ユニット１２１は、種々の商用的に可能なプロセッサのいずれとすることもでき、これには、インテル（登録商標）ｘ８６、ペンティアム（登録商標）およびインテル（登録商標）その他の、Ｃｙｒｉｘ、ＡＭＤおよびＮｅｘｇｅｎを含むメーカによる互換マイクロプロセッサ；ＤｉｇｉｔａｌのＡｌｐｈａ；ＭＩＰＳ  Ｔｅｃｈｎｏｌｏｇｙ、ＮＥＣ、ＩＤＴ、ＳｉｅｍｅｎｓなどのＭＩＰＳ；および、ＩＢＭ（登録商標）とＭｏｔｒｏｌａのＰｏｗｅｒＰＣが含まれる。デュアルマイクロプロセッサおよびその他のマルチプロセッサのアーキテクチャも、処理ユニット１２１として用いることができる。
【００２６】
システムバスは、メモリバスあるいはメモリコントローラ、ペリフェラルバス、およびＰＣＩ、ＶＥＳＡ、マイクロチャネル、ＩＳＡないしＥＩＳＡなど種々の従来のバス構造のいずれかを用いるローカルバスが含まれる数種のバス構造のいずれとすることもできる。システムメモリは、読取専用メモリ（ＲＯＭ）１２４およびランダムアクセスメモリ（ＲＡＭ）１２５を含む。基本入出力システム（ＢＩＯＳ）は、スタートアップ時のようにコンピュータ１２０内のエレメント間における情報の転送を支援する基本的なルーチンを含むが、ＲＯＭ１２４に格納される。
【００２７】
コンピュータ１２０はさらに、ハードディスクドライブ１２７、（例えば取外し可能なディスク１２９の読み書きをするための）磁気ディスクドライブ１２８、および（例えばＣＤ−ＲＯＭディスク１３１を読むあるいはその他の光媒体の読み書きを行うための）光ディスクドライブ１３０を含む。ハードディスクドライブ１２７、磁気ディスクドライブ１２８および光ディスクドライブ１３０は、それぞれ、ハードディスクドライブインタフェース１３２、磁気ディスクドライブインタフェース１３３および光ドライブインタフェース１３４によってシステムバス１２３に接続される。ドライブと関連するコンピュータ読み取り可能な媒体によって、サーバコンピュータ１２０のための不揮発性データ記憶、データ構造、コンピュータ実行可能命令などが提供される。以上のコンピュータ読み取り可能な媒体の説明ではハードディスク、取外し可能なディスクおよびＣＤを参照しているが、例示の動作環境では、コンピュータによって読み取りが可能であるその他の種類の媒体、例えば磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ベルヌイカートリッジなどもまた用いることができることが、本技術分野の当業者には理解されるであろう。
【００２８】
オペレーティングシステム１３５、１つまたは複数のアプリケーションプログラム１３６、その他のプログラムモジュール１３７およびプログラムデータ１３８を含む多くのプログラムモジュールは、ドライブおよびＲＡＭに記憶することができる。例示のコンピュータのオペレーティングシステム１３５は、マイクロソフト（登録商標）ウィンドウズ（登録商標）ＮＴサーバオペレーティングシステム並びに前述のマイクロソフト（登録商標）トランザクションサーバ、マイクロソフト（登録商標）ウィンドウズ（登録商標）９５、マイクロソフト（登録商標）ウィンドウズ（登録商標）９８またはマイクロソフト（登録商標）ウィンドウズ（登録商標）２０００とすることができる。
【００２９】
ユーザは、コマンドおよび情報をキーボード１４０およびマウス１４２のようなポインティング機器を通してコンピュータ１２０に入力することができる。その他の入力機器（図示せず）には、マイクロホン、ジョイスティック、ゲームパッド、サテライトディッシュ、スキャナ、などを含めることができる。以上の入力機器その他は、通常、システムバスに結合するシリアルポートインタフェース１４６を介して処理ユニット１２１に接続されるが、その他のインタフェース、例えばパラレルポート、ゲームポートあるいはユニバーサルシリアルバス（ＵＳＢ）によって接続することもできる。モニタ１４７またはその他の種類の表示機器もまた、ビデオアダプタ１４８のようなインタフェースを介してシステムバス１２３に接続される。モニタに加えて、コンピュータは、通常、スピーカおよびプリンタのようなその他のペリフェラル出力機器（図示せず）を含む。
【００３０】
コンピュータ１２０は、リモートサーバやクライアントコンピュータ１４９のような１つまたは複数のコンピュータへの論理的接続を用いてネットワーク環境で動作することができる。リモートコンピュータ１４９は、ワークステーション、サーバコンピュータ、ルータ、ピア機器またはその他の通常のネットワークノードとすることができ、そして、図４では単にメモリ記憶機器１５０が示されただけだが、一般に、コンピュータ１２０に関連して説明したエレメントの多くまたは全てを含む。図４に示す論理的接続は、ローカルエリアネットワーク（ＬＡＮ）および広域ネットワーク（ＷＡＮ）を含む。この様なネットワーク環境は、オフィス、企業内コンピュータネットワーク、イントラネットおよびインターネット内でよく見られるものである。
【００３１】
ＬＡＮネットワーク環境内で用いられるとき、コンピュータ１２０は、ネットワークインタフェースまたはアダプタ１５２を介してローカルネットワーク１５１に接続される。ＷＡＮネットワーク環境において用いられるとき、サーバコンピュータ１２０は、通常、モデム１５４を含み、あるいはＬＡＮ上のコミュニケーションサーバに接続し、またはインターネットなどの広域ネットワークを介して通信を確立するためのその他の手段を有する。モデム１５４は、内蔵あるいは外付けとすることができるが、シリアルポート１４６を介してシステムバス１２３に接続される。ネットワーク環境では、コンピュータ１２０に関連して示されたプログラムモジュールあるいはその部分は、リモートメモリ記憶機器に格納することができる。示されたネットワーク接続は一例であり、コンピュータ間で通信リンクを確立するその他の手段も用いることができることが理解されるであろう。
【００３２】
コンピュータプログラミングの技術分野の当業者の実務に従って、本発明は、その他の方法で示されない限り、コンピュータ１２０によって実行される動作および記号で表されたオペレーションを参照して以下に説明される。この様な動作およびオペレーションは、ときおりコンピュータ実行可能であるとして説明される。動作および記号で表されたオペレーションは、結果としてその電気信号の表現を変換しあるいは減少させる、データビットを表す電気信号の処理ユニット１２１による操作および、（システムメモリ１２２、ハードドライブ１２７、フロッピ（登録商標）ディスク１２９およびＣＤ−ＲＯＭ１３１を含む）メモリシステムにおけるメモリ位置でのデータビットの維持を含み、それによりコンピュータシステムの再構成または変更を行い、および他の信号処理を行う。データビットが維持されるメモリ位置は、そのデータビットに対応する一定の電気的、磁気的あるいは光学的特性を有する物理的位置である。
【００３３】
図５は、本発明にかかるより詳細な環境を示す。プロセッサ２００は、バス２２５を介してメモリ媒体２２０に結合する。プロセッサ２００は、また、ネットワークライン２１５を介してネットワーク２１０にも結合する。ネットワーク２１０によって、プロセッサ２００は、他のリモートコンピュータとアセンブリおよびその他のコンポーネントを検索および送信する。メモリ媒体２２０は、メモリの残りの部分とは分離したキャッシュメモリ２３０を含む。キャッシュメモリ２３０は、アプリケーション２３２が実行されるところである。残りのメモリは、二次キャッシュ、ＲＯＭ、ＲＡＭ、または固定ないしフロッピ（登録商標）ディスク媒体とすることができる。ハッシュコンポーネント２６０は、アセンブリの開発段階の間は、アセンブリのハッシュ値を挿入するためメモリ媒体２２０上に置かれる。しかし、ハッシュコンポーネント２６０は、アプリケーションとアセンブリの初期展開およびテストの間、あるいは後に管理者によってハッシュ値を挿入することができる。
【００３４】
デジタル署名コンポーネント２６５は、生成するアセンブリで使用するための鍵ペアを提供する。デジタル署名コンポーネント２６５は、また、開発中のアセンブリのマニフェストに公開鍵を挿入することもできる。デジタル署名コンポーネント２６５は、ハッシュコンポーネント２６０を用いてアセンブリの内容をハッシュ計算し、次いで、秘密鍵によってハッシュ値を暗号化するが、これは、アセンブリのマニフェストに格納された公開鍵を含んでいる鍵ペアの一部である。ハッシュコンポーネント２６０およびデジタル署名コンポーネント２６５は、オペレーティングシステム２７５の一部として常駐するアプリケーションプログラムインタフェース（ＡＰＩ）とすることができる。しかし、ハッシュコンポーネント２６０およびデジタル署名コンポーネント２６５は、アプリケーションプログラム２３２の一部とすることもできる。さらに、ハッシュコンポーネント２６０およびデジタル署名コンポーネント２６５は、いくつかの異なるコンポーネント、例えばハッシュ、バージョン管理、鍵ペア生成および挿入機能のために別々のコンポーネントを備えることができる。
【００３５】
アプリケーションプログラム２３２は、キャッシュ２３０に展開され、およびロードされる。アプリケーションプログラム２３２は、ローダ２５０と通信を行い、ローダ２５０は、アプリケーションプログラム２３２によって指定されたアセンブリを、アプリケーション２３２が実行時使用するためにロケートして、これらのアセンブリをキャッシュ２３０にロードする。本実施例においては、アセンブリＡと付された第１のアセンブリ２３４およびアセンブリＢと付された第２のアセンブリ２３４は、キャッシュ２３０にロードされる。第２のアセンブリ２３６は、第１のモジュール２３８と第２のモジュール２４０とを含み、これらもまた、キャッシュ２３０にロードされる。第１のアセンブリ２３４および第２のアセンブリ２３６は、オペレーティングシステム２７５の一部である共有アセンブリとして常駐する、リモートコンピュータ上にライブラリとして常駐する、アプリケーション２３２の一部としてディレクトリに常駐する、またはその他のアプリケーションプログラム内に存在することができる。
【００３６】
バインディングコンポーネント２８０もまた、メモリ媒体２２０に常駐する。バインディングコンポーネント２８０は、バインディングポリシーを提供し、共有アセンブリを扱うアプリケーションを管理するために用いられる。バインディングコンポーネント２８０は、アセンブリの元のバージョン、アップグレードバージョンあるいは標準化されたバージョンのいずれにバインドするかを決定することができる。例えば、第１のアセンブリ２３４および第２のアセンブリ２３６は、第１のアセンブリ２３４のアップデートバージョンが第２のアセンブリ２３６の場合、同一のアセンブリ名を有することがある。さらに、双方のアセンブリともローダ２５０によってキャッシュ２３０にロードすることができる。次いで、バインディングコンポーネント２８０は、バインディングコンポーネント２８０で定められたバインディングポリシーに基づき、アプリケーションプログラム２３２が第１のアセンブリ２３４または第２のアセンブリ２３６にバインドするべきか否かを決定することができる。バインディングコンポーネント２８０によって、同一の名前をもつアセンブリは、システム内で並列に常駐することとなり、アプリケーションプログラム２３２、開発者またはシステム管理者は、適切なバインディングポリシーによってなされる決定を制御することができるようになる。
【００３７】
検証コンポーネント２７０は、メモリ媒体２２０に常駐する。検証コンポーネント２７０は、起動し、アセンブリのマニフェストを読み取り、鍵トークンと鍵の値を比較し、暗号化されたハッシュ値を公開鍵を用いて復号化し、およびアセンブリをハッシュ計算するために用いられるハッシュアルゴリズムを呼び出す。次いで、検証コンポーネント２７０は、アセンブリに関する暗号化されたハッシュ値を復号化した値をアセンブリ上で実際に動作するハッシュ値と比較する。検証コンポーネント２７０は、アセンブリの作成者が秘密鍵の所有者であるか否か、あるいはアセンブリに変更がなされたか否かにかかわらず、アプリケーションプログラム２３２と通信することができる。次いで、検証コンポーネント２７０は、バインディングコンポーネント２８０が設定したバインディングポリシーに基づき、バージョンおよび発行者の情報を検査するか否かを決定することができる。本発明のこれと代わる形態においては、検証コンポーネントは、アプリケーションプログラムの初期展開とテストの間用いられるデジタル署名およびアセンブリのハッシュ値のテーブルを保存する。次に、検証コンポーネントは、アセンブリ上でハッシュ計算を行い、そのハッシュ値をテーブル内で見つけられたハッシュ値と比較する。検証コンポーネント２７０は、オペレーティングシステム２７５の一部としてアプリケーションプログラムインタフェース（ＡＰＩ）とし、またはアプリケーションプログラム２３２の一部とすることができる。
【００３８】
上記のコンポーネントの例で、分離して示したのは、ただ例示の目的のためだけであることが理解されるべきである。また、上述の機能を保持している間も、種々のコンポーネントがその他のコンポーネントの中に統合され得ることが理解されるべきである。さらに、上記の説明は、本発明を実施するためにコンポーネントが相互にどのように影響し合う可能性があるかを例示したものであり、本発明を実施するためにはその他の例も用いることができる。
【００３９】
図６は、モジュールを有するアセンブリの完全性を保証し、および検証するための特有の方法論を示す。ステップ３００で、少なくとも１つのモジュールを有するアセンブリが提供される。ステップ３１０で、アセンブリ中のトップのアセンブリに公開鍵を含む識別情報が提供され、この公開鍵は、また、記憶媒体に格納される。ステップ３２０では、トップのアセンブリのファイル内容全体のハッシュ値が提供され、次いで、公開鍵と鍵ペアを形成する秘密鍵を用いて暗号化され、そして、暗号化された値はアセンブリの最後に添付される。アプリケーションプログラム２３２およびアプリケーションプログラムによって用いられるアセンブリは、キャッシュ２３０にロードして実行することができる。ステップ３３０で、公開鍵は、トップのアセンブリの識別情報から読み出され、これを用いて暗号化されたハッシュ値を復号化することによって、復号化された値をトップのアセンブリの実際の値と比較することができる。ステップ３４０では、アセンブリの内容が変更されたか否かの決定がなされる。アセンブリが変更された場合（はい）、ステップ３４５でアプリケーションプログラムはアボートする。アセンブリが変更されなかった場合（いいえ）、ステップ３５０で、マニフェスト中の公開鍵が記憶媒体に格納された公開鍵と比較される。公開鍵は、また、あるアセンブリからもう一方へのリファレンスが解決されるとき、比較されることがある。ステップ３６０では、公開鍵が合致するか否かの決定が、検証コンポーネント２７５によって行われる。発行者が同一でもなく、オリジナルの発行者でもない場合（いいえ）、ステップ３６５で、アプリケーションプログラムはアボートする。発行者が同一かまたはオリジナルの発行者の場合（はい）、ステップ３７０で、モジュールはハッシュ計算され、その値は識別情報に格納されたハッシュ値によって検査されてアセンブリが実行される。
【００４０】
図７は、他のアセンブリから参照されるアセンブリの完全性を保証および検証するための特有の方法論を示す。ステップ４００では、少なくとも１つのアセンブリを参照するアセンブリが提供される。ステップ４１０では、公開鍵を含む識別情報を参照される側のアセンブリに提供する。ステップ４２０では、参照される側のアセンブリのハッシュ値が提供され、公開鍵に合致する秘密鍵によって暗号化され、および暗号化されたハッシュ値は、参照される側のアセンブリの最後に添付される。ステップ４３０で、アセンブリは、参照される側のアセンブリ全部のリストと参照される各アセンブリの対応する公開鍵の公開鍵トークンとを含む依存関係情報の提供を受ける。アプリケーションプログラム２３２およびこのアプリケーションプログラムによって用いられるアセンブリは、ローダ２５０によってキャッシュ２３０にロードされて実行することができる。ステップ４４０で、参照されるアセンブリの公開鍵が読み込まれ、暗号化されたハッシュ値は公開鍵を用いて復号化されて、復号化されたハッシュ値が、参照される側のアセンブリ上で実際に動作するハッシュ値と比較される。ステップ４５０で、参照される側のアセンブリの内容が変更されたか否かの判定がなされる。参照されるアセンブリの少なくとも１つが変更された場合（はい）、ステップ４５５でアプリケーションプログラムはアボートする。参照される側のアセンブリのいずれも変更されなかった場合（いいえ）、ステップ４６０で、参照する側のアセンブリの公開鍵トークンは、参照される側のアセンブリの公開鍵と比較される。ステップ４７０で、参照されるアセンブリの発行者が同一であるかオリジナルの発行者であるかの判定が、検証コンポーネント２７５によって行われる。発行者がオリジナルの発行者ではない場合（いいえ）、ステップ４７５で、アプリケーションプログラムはアボートする。発行者がオリジナルの発行者である場合（はい）、ステップ４７０で、参照される各アセンブリのモジュールが検証されてアセンブリが実行される。
【００４１】
図８〜１０は、実行時に、ツール間で共有名（ｓｈａｒｅｄ  ｎａｍｅｓ）の実装を促進するために必要となる暗号化機能を提供するように適応された簡略ＡＰＩを示す。本実施例では、暗号サービスプロバイダ（ＣＳＰ）、鍵管理およびデジタル署名／検証オペレーションを用いることに伴う複雑さを多く除去している。本発明のＡＰＩの例は、種々の異なるプラットフォームに移植することができるＡＰＩのセットも示している。
【００４２】
共有名の生成には、開発環境のプラットフォーム上で、公開／秘密鍵のペアの生成、ハッシュ計算、デジタル署名および署名の検証のサポートが必要となる。実行時のプラットフォームでは、ハッシュ計算および署名の検証のみが必要とされる。ＡＰＩは、開発および実行時のシステムをサポートする作業が可能となるように分離される。本実施例のＡＰＩは、全ての暗号化オペレーション（例えば"Microsoft Base Cryptographic Provider v 1.0"）、ＲＳＡ署名アルゴリズムおよびＳＨＡ−１ハッシュアルゴリズムのための予め設計されたＣＳＰの実装を前提とする。暗号ＡＰＩ関数は、成功の場合、真を返し、エラーが生じた場合、偽を返す関数を持つ非管理Ｃコードインタフェースとして提供される。
【００４３】
本実施例のＡＰＩは、鍵の生成と管理をコンパイラベンダによってサポートすることができる。本実施例のＡＰＩは、容易に使用できる間に通常の開発シナリオを柔軟に進めることができるように設計される。これらのＡＰＩを用いて、コンパイラは、共有名の暗号の鍵ペアを生成すること、および容易に格納し、開発環境のプラットフォーム間を移動することができる表現（移植が可能な鍵のブロブ）を検索することが可能となる。共有名の暗号の鍵ペアをプロジェクトに関連させることおよび共有名を生成するためにそれを用いることもまた可能である。鍵ペアは、共有名を生成するための暗号化サービスプロバイダ（ＣＳＰ）に永久にインストールされる必要はないので、容易に各プロジェクトのための全く別個の鍵ペアを使用することに対応することができる。加えて、本実施例のＡＰＩは、共有名の鍵のオペレーションを行なっても、そのユーザのマシン上の他のアプリケーションが暗号化機能を使用することに影響を与えないことを保証する。
【００４４】
図８ａは、共有名を使用するための新たな鍵ペアを生成し、および呼び出すプログラムに対し鍵ペアを送り出す関数を示す。コンテナ名は、ユーザ定義による文字列である。ユーザは、関数によって、複数の共有名の鍵ペア（例えば、project1とproject2、testとdeploy）を管理することができるように名前を定めることができる。ｄｗＦｌａｇｓパラメータは、随意の動作を制御するために用いられる。このバージョンのために定義された唯一のフラッグは、ＳＮ＿ＬＥＡＶＥ＿ＫＥＹ（値は１）である。これが設定される場合、鍵ペアは、共有名ＣＳＰにインストールされたままとなる。図８ａの関数によって、「ＳＮＫ」を付した所与のコンテナ名を用いて、新たに署名する鍵ペアを生成しようとすることができる。接頭辞ＳＮＫは、呼び出すアプリケーションには見えず、これを用いて、所与のコンテナ名が、異なるアプリケーションで使用されるものと衝突しないことをうまく保証する。本発明の範囲から離れない限りこれに代わる接頭辞を用いることができる。生成された鍵は、（ＣＳＰがサポートされていれば）送信可能とマークされ、公開／秘密鍵は、暗号化されない鍵のブロブに送信される。これは、呼び出し側に戻される。鍵ブロブは、呼び出すアプリケーションに適した任意の方法で格納することができる。変更された場合、それは最早使用することができないであろう。
【００４５】
図８ｂは、移植可能な鍵ブロブをマシンＣＳＰにインストールするために用いることができる関数を示す。その目的は、デフォルトの共有名のインストールをサポートすることである。この関数は、鍵ブロブに供給された鍵ペアの所与のコンテナ名を用いた共有名ＣＳＰへのインストールを試みる。上記で言及したように、コンテナ名は、トランスペアレントな「ＳＮＫ」を付加して、その他のアプリケーションの鍵と衝突する可能性を最小限にすることができる。コンテナ名が既に存在するかまたは無効な鍵ブロブが供給される場合、エラーが返される。
【００４６】
図８ｃは、共有名鍵ペアをＣＳＰから削除するために用いられる関数を示す。これは、鍵生成時にＳＮ＿ＬＥＡＶＥ＿ＫＥＹオプションが選択された場合、または鍵が順次ＣＳＰにインストールされた場合にのみ必要となる。この関数は、フラッグＣＲＹＰＴ＿ＤＥＬＥＴＥＫＥＹＳＥＴを持つ所与の鍵コンテナ名に対する共有名ＣＳＰのコンテキストを取得するであろう。所与のコンテナ名は、その他のアプリケーションと名前が衝突する可能性があるが、オペレーションの前に「ＳＮＫ」を付して、この衝突を回避することができる。図８ｄは、図８ａに示した共有名関数によって割り当てられたメモリを開放するために用いられる関数を示す。
【００４７】
共有名の名前空間を安全に定める場合、アセンブリのメタデータを含む移植性のある実行可能な（ｐｏｒｔｂｌｅ  ｅｘｅｃｕｔａｂｌｅ）（ＰＥ）ファイルが、名前空間を定める公開鍵に対応する秘密鍵によって署名される。この開発環境で、共有名を生成するのに必要なオペレーションの実行が可能である。まず、共有名公開鍵のブロブが検索される。鍵ブロブは、これを保持するための空間がメタデータセクションに確保され挿入される。共有名の公開鍵ブロブは、任意に、プロジェクトシステムによって格納することができ、これによりその他のアセンブリにリファレンスを生成するとき用いることができる。次に、共有名の署名ブロブのサイズが検索される。この署名を保持するためＰＥファイルに空間が割り当てられる。そうして、ＰＥファイルはディスクにセーブすることができる。以上によって、共有名の署名ブロブを生成することができる。呼び出すプログラムは、ＰＥファイルの名前および共有名を提供用いるであろう。署名関数は、署名を計算し、および任意にＰＥファイルの定義されたセクションにそれを挿入するであろう。図９ａ〜９ｃは、上述のオペレーションをサポートするＡＰＩを示す。各関数において、共有名の鍵ペアは、移植性のある鍵ブロブまたは共有名ＣＳＰに既にインストールされた鍵に対するコンテナ名のリファレンスとして提供することができる。共有名のＣＳＰ、ハッシュアルゴリズムおよび署名アルゴリズムは、デフォルトのマシン設定に基づくことができる。
【００４８】
図９ａは、公開鍵ブロブの検索をサポートする方法を示す。この関数は、所与の名前ｓｚＣｏｎｔａｉｎｅｒを持つ共有名ＣＳＰコンテキストの取得を試みるであろう。上述のＡＰＩに示したように、コンテナ名は、特に記さないが、「ＳＮＫ」を付されるであろう。ｐｂＫｅｙＢｌｏｂがｎｏｎ＿ＮＵＬＬの場合、ＣＲＹＰＴ＿ＮＥＷＫＥＹＳＥＴによってＣＳＰが得られる。この場合、コンテナ名が存在するならエラーが返される。ＣＳＰの取得に成功した場合、鍵ブロブの鍵ペアを読み出すことができる。この場合、鍵ペアはその関数が戻る前に削除されるであろう。図９ｂは、返されたＰｕｂｌｉｃＫｅｙＢｌｏｂを符号化したものを示す。
【００４９】
図９ｃは、署名オペレーションをサポートするＡＰＩを示す。これを用いて、ＰＥファイルの空間が割り当てられるように、署名ブロブのサイズを検索することができる。そうして、署名を生成することができる。この関数は、任意にＰＥファイルに直接署名を書き込むことができ、あるいは、呼び出し者に署名ブロブを返すことができる。この関数は、所与の名前ｓｚＣｏｎｔａｉｎｅｒを持つ共有名ＣＳＰコンテキストの取得を試みるであろう。既に議論したように、特に記さないが、コンテナ名に「ＳＮＫ」を付すことができる。ｐｂＫｅｙＢｌｏｂがＮＵＬＬの場合、鍵ペアがＣＳＰに既にインストールされており、したがって、コンテナが既に存在し、それは署名アルゴリズムに関連する公開鍵ペアを含むと仮定される。ｐｂＫｅｙＢｌｏｂがｎｏｎ＿ＮＵＬＬの場合、ＣＲＹＰＴ＿ＮＥＷＫＥＹＳＥＴによってＣＳＰが得られる。この場合、コンテナ名は存在しないに違いない。ＣＳＰの取得に成功した場合、鍵ブロブの鍵ペアを読み出すことができる。この場合、鍵ペアはその関数が戻る前に削除されるであろう。ｓｚＦｉｌｅＰａｔｈがＮＵＬＬの場合、それは署名ブロブのサイズのみが返されるべきであることを示している。これは、＊ｐｐｂＳｉｇｎａｔｕｒｅＢｌｏｂが指し示す場所に返される。ｓｚＦｉｌｅＰａｔｈがｎｏｎ＿ＮＵＬＬの場合、ＰＥファイルはハッシュされ、そのハッシュは秘密鍵を用いて署名される。ｐｐｂＳｉｇｎａｔｕｒｅＢｌｏｂがＮＵＬＬの場合、この関数は、署名ブロブをＰＥの予約されたセクションに挿入し、および必要なＰＥの設定（ｆｉｘ−ｕｐｓ）（例えば、ＣＲＣ）を実行するであろう。呼び出し者が署名ブロブおよびそのＰＥファイルへの挿入を希望する場合、ｐｐｂＳｉｇｎａｔｕｒｅＢｌｏｂはポインタ変数への有効なポインタとなるに違いない。
【００５０】
図１０ａ〜１０ｃは、共有名の名前空間を参照し、および署名の検証を行うためのサイズ固定の「トークン」の生成を示す。これは、名前空間に関連する公開鍵からハッシュ関数を用いて計算される。このハッシュ計算が用いられ、鍵サイズに関連するトークンのサイズが縮減され、トークンが一意（静的な一意）であることが高位に保証され、および共有名の捏造が極めて困難になる。ＳＨＡ−１ハッシュ関数は、共有名を生成するのにその使用を前提としていることから、必要とされる特性を持ち、すぐに使用できるものである。ＳＨＡ−１を使用する際の欠点は、１６０ビットの値を生成することである。これは、典型的なＲＳＡ署名鍵（５１２ビットまたはこれ以上）よりはかなり小さいが、ＥＣＣなどの他のアルゴリズムで通常用いられる鍵サイズよりは大きい。このトークンのサイズを縮小するため、ＳＨＡ−１ハッシュの下位の６４ビットが、トークンの値として用いられるであろう。図１０ａは、公開鍵ブロブがＰＥファイル（メタデータのＰｕｂｌｉｃＫｅｙＢｌｏｂ構造）にある参照される側のアセンブリのマニフェストから抽出される場合のトークンを生成するための関数を示す。図１０ｂは、トークンを公開鍵ブロブ構造から生成することが望ましい場合の関数を示す。
【００５１】
図１０ｃは、共有名の公開鍵を用いることによって、共有名の署名ブロブを検証するための関数を示す。このオペレーションは、アセンブリマニフェストを含むＰＥファイルへのリファレンスを必要とする。この関数が真を返す場合、署名は検証され、そうでない場合、偽が返され、およびその共有名は尊重されるべきではない。ｓｚＦｉｌｅＰａｔｈは、ＰＥファイルへの有効なリファレンスであり、メタデータのＰｕｂｌｉｃＫｅｙＢｌｏｂ構造およびこの目的のために確保されたＰＥファイルのセクションにある共有名の署名ブロブを含むべきである。この関数は、関数ＳｈａｒｅｄＮａｍｅＳｉｇｎａｔｕｒｅＧｅｎｅｒａｔｉｏｎ（）内で用いられる同一のアルゴリズムを用いて、ＰＥファイルのハッシュ値を計算する。
【００５２】
検証には、使用されるアルゴリズムに依存するハッシュ、署名および公開鍵に関するオペレーションが必要である。ツールは暗号化支援ＡＰＩおよびアセンブリメタデータＡＰＩを用いて共有名をアセンブリに割り当てる。共有名（ＡｓｓｅｍｂｌｙＲｅｆｓ）を持つアセンブリへのリファレンスには、参照されるアセンブリの共有名を生成するために用いられる公開鍵を表す「トークン」が含まれる。このトークンは、所望のアセンブリのロケートを支援するため、バインド時に用いられる。
【００５３】
アセンブリがローカルのアセンブリキャッシュに置かれるとき、共有名の署名は、実行時までに検証することができる。検証がキャッシュロード時に行われることから、共有名を持つアセンブリへのバインドは、鍵が同値であるとの確認が必要なだけである。参照されるアセンブリの一部として記録された共有名のトークンは、キャッシュのルックアップに含むことができる。あるいはまた、その個別の鍵に対する共有名に関して定められたセキュリティポリシーにアクセスする定義されたコードが存在する場合は、署名はロード時に検証することができる。
【００５４】
本発明は、プログラムの方法論および／またはコンピュータアーキテクチャ、および個別の実施例に関して例示されたが、本発明を実行するのに適した種々のプログラムの方法論および／またはコンピュータアーキテクチャを用いることができるものであり、請求項の範囲に入るよう意図されたものであることが理解されるべきである。
【００５５】
本発明は、その好ましい形態を参照して説明してきた。上記の詳細な説明を読解することで、これを変更し、または代替する形態を実施しようとすることは明らかである。本発明は、このような変更や代替、およびこれに等価のもの全てを含むと解釈されるよう意図したものである。
【００５６】
（産業上の利用可能性）
本発明は、コンピュータおよびコンピュータソフトウェアの分野における産業上の利用可能性を有する。
【図面の簡単な説明】
【図１】  本発明の一形態による複数のモジュールを有するアセンブリを示すアセンブリのブロック図を示す。
【図２】  本発明の一形態による複数のモジュールを有するアセンブリの詳細なブロック図を示す。
【図３】  本発明の一形態による複数のアセンブリを参照するアセンブリの詳細なブロック図を示す。
【図４】  本発明の一環境によるコンピュータシステムのブロック図を示す。
【図５】  本発明による一環境の詳細なブロック図を示す。
【図６】  本発明の一形態によるアセンブリの完全性を促進する特定の方法論のフロー図を示す。
【図７】  本発明の一形態によるアセンブリの完全性を促進するその他の方法論のフロー図を示す。
【図８ａ】  本発明の一形態による共有名の使用のための鍵ペアを生成するためのＡＰＩを示す。
【図８ｂ】  本発明の一形態による共有名ＣＳＰのための鍵ブロブをインストールするためのＡＰＩを示す。
【図８ｃ】  本発明の一形態によるＣＳＰから鍵ペアを削除するためのＡＰＩを示す。
【図８ｄ】  本発明の一形態による共有名関数によってアロケートされたメモリを開放するためのＡＰＩを示す。
【図９ａ】  本発明の一形態による公開鍵ブロブを検索するためのＡＰＩを示す。
【図９ｂ】  本発明の一形態による図９ａに示すＡＰＩから戻された公開鍵ブロブを示す。
【図９ｃ】  本発明の一形態によるデジタル署名を生成するためのＡＰＩを示す。
【図１０ａ】  本発明の一形態によるアセンブリから抽出される公開鍵からトークンを生成するためのＡＰＩを示す。
【図１０ｂ】  本発明の一形態による公開鍵構造からトークンを生成するためのＡＰＩを示す。
【図１０ｃ】  本発明の一形態による.共有名の署名を検証するためのＡＰＩを示す。
【図１】
0004510373.tif 000002
【図２】
0004510373.tif 000003
【図３】
0004510373.tif 000004
【図４】
0004510373.tif 000005
【図５】
0004510373.tif 000006
【図６】
0004510373.tif 000007
【図７】
0004510373.tif 000008
【図８ａ】
0004510373.tif 000009
【図８ｂ】
0004510373.tif 000010
【図８ｃ】
0004510373.tif 000011
【図８ｄ】
0004510373.tif 000012
【図９ａ】
0004510373.tif 000013
【図９ｂ】
0004510373.tif 000014
【図９ｃ】
0004510373.tif 000015
【図１０ａ】
0004510373.tif 000016
【図１０ｂ】
0004510373.tif 000017
【図１０ｃ】
0004510373.tif 000018