(57)【特許請求の範囲】
【請求項１】
（Ａ）各手順呼出しに応じて、指定されたプログラム・モジュールの信憑性を確認することによって、かつ、検証確認または否認をリターンすることによってプログラム・モジュール・ベリファイアへの手順呼出しに応答するように構成され、前記指定されたプログラム・モジュールの前記信憑性を確認することは、（Ａ１）前記指定されたプログラム・モジュールに含まれるディジタル署名を対応復号キーで復号し、（Ａ２）所定のメッセージ・ダイジェスト関数に従って前記指定されたプログラム・モジュールの少なくとも一部分のメッセージ・ダイジェストを生成し、（Ａ３）前記復号されたディジタル署名が前記メッセージ・ダイジェストにマッチするときに検証確認をリターンし、（Ａ４）前記復号されたディジタル署名が前記メッセージ・ダイジェストにマッチしないときに検証否認をリターンすること、によって行われるプログラム・モジュール・ベリファイアと、
（Ｂ）第１のディジタル署名及び第１の実行可能手順を含む、第１のプログラム・モジュールと、
（Ｃ）第２のディジタル署名及び第２の実行可能手順を含む、第２のプログラム・モジュールとを備え、
前記第１及び第２のプログラム・モジュールの一つは、当該第１及び第２のプログラム・モジュールへの手順呼出しを含み、
前記第１及び第２のプログラム・モジュールの少なくとも一つは、
前記第１及び第２のプログラム・モジュールの内で当該第１及び第２のプログラム・モジュールの前記少なくとも一つとは他のものであるプログラム・モジュールの信憑性を確認するための前記プログラム・モジュール・ベリファイアへの手順呼出しと、
前記プログラム・モジュール・ベリファイアへの前記手順呼出しが前記プログラム・モジュール・ベリファイアによってリターンされる検証否認を結果として生ずるときに前記一つのプログラム・モジュールの実行を中止する命令とを含んでいることを特徴とするコンピュータ・システム。
【請求項２】
前記第１のプログラム・モジュールは、前記第２のプログラム・モジュールへの手順呼出しを含んでおり；
前記第２のプログラム・モジュールは、
（Ｃ１）前記第２のプログラム・モジュールへの前記手順呼出しに応答して実行されるべき実行可能手順；
（Ｃ２）前記実行可能手順の実行より前に実行されるように前記第２のプログラム・モジュールに論理的に配置される前記プログラム・モジュール・ベリファイアへの手順呼出し；及び
（Ｃ３）前記プログラム・モジュール・ベリファイアへの前記手順呼出しが前記プログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに前記実行可能手順の実行を防ぐ命令
を含んでいることを特徴とする請求項１に記載のコンピュータ・システム。
【請求項３】
前記第２の実行可能手順の実行の終了を防ぐ前記命令は、前記プログラム・モジュール・ベリファイアへの前記手順呼出しが、前記プログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに前記第２のプログラム・モジュールの実行を中止する命令を含むことを特徴とする請求項２に記載のコンピュータ・システム。
【請求項４】
前記第１のプログラム・モジュールは、
前記第２のプログラム・モジュールへの手順呼出し；
前記第２のプログラム・モジュールへの前記手順呼出しの実行より前に実行されるように前記第１のプログラム・モジュールに論理的に配置される前記プログラム・モジュール・ベリファイアへの手順呼出し；及び
前記プログラム・モジュール・ベリファイアへの前記手順呼出しが前記プログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに前記第２のプログラム・モジュールへの前記手順呼出しの実行を防ぐ命令を含んでいることを特徴とする請求項１、２、または３に記載のコンピュータ・システム。
【請求項５】
プログラム・モジュールをリンクする方法であって、
前記プログラム・モジュールの信憑性を確認することは、それに含まれるディジタル署名を対応復号キーで復号し、所定のメッセージ・タイジェスト機能に従って前記プログラム・モジュールの少なくとも一部のメッセージ・ダイジェストを生成し、前記復号されたディジタル署名が前記メッセージ・ダイジェストに一致するときに前記プログラム・モジュールの信憑性が確認され、かつ前記復号されたディジタル署名が前記メッセージ・ダイジェストに一致しないときに前記プログラム・モジュールの信憑性の確認が否認されることによって行われるものであり、
前記方法は、
（Ａ）第１のディジタル署名を含む第１のプログラム・モジュールから第２のディジタル署名を含む第２のプログラム・モジュールへの手順呼出しを行うより前に、前記第２のプログラム・モジュールの信憑性を確認し；
（Ｂ）前記第２のプログラム・モジュールの信憑性を確認することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを行い；かつ
（Ｃ）前記第１のプログラム・モジュールの信憑性を確認することに失敗することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを防ぐ段階を具備することを特徴とする方法。
【請求項６】
（Ｄ）前記第１のプログラム・モジュールにより前記手順呼出しに応じて前記第２のプログラム・モジュールにおいて手順を実行することを終了するより前に、前記第１のプログラム・モジュールの信憑性を確認し；
（Ｅ）前記第１のプログラム・モジュールの信憑性を確認することにより、結果を生成するために前記第２のプログラム・モジュールにおいて前記手順を実行することを終了しかつ前記結果を前記第１のプログラム手順にリターンし；かつ
（Ｆ）前記第１のプログラム・モジュールの信憑性を確認することに失敗することにより、前記第２のプログラム・モジュールにおける前記手順の実行の終了を防ぐ段階を更に具備することを特徴とする請求項５に記載の方法。
【請求項７】
前記段階（Ｃ）は、前記第１のプログラム・モジュールの実行を中止することを含むことを特徴とする請求項５または６に記載の方法。
【請求項８】
前記第１のプログラム・モジュールは、第１のディジタル署名を含みかつ前記第２のプログラム・モジュールは、第２のディジタル署名を含み；
前記段階（Ａ）は、対応する復号キーで前記第２のプログラム・モジュールにおける前記第２のディジタル署名を復号し、前記所定のメッセージ・タイジェスト機能に従って前記第２のプログラム・モジュールの少なくとも一部のメッセージ・ダイジェストを生成し、前記復号されたディジタル署名が前記メッセージ・ダイジェストに一致するときに前記第２のプログラム・モジュールの信憑性を確認し、かつ前記復号されたディジタル署名が前記メッセージ・ダイジェストに一致しないときに前記第２のプログラム・モジュールの信憑性の確認を否認することを含んでいることを特徴とする請求項５または６に記載の方法。
【請求項９】
前記段階（Ａ）は、前記第２のプログラム・モジュールの信憑性を確認することによりかつ前記手順呼出しに応じて確認認証または否認をリターンすることによって前記手順呼出しに応答している信用プログラム・モジュール・ベリファイアへの手順呼出しを行うことを含んでいることを特徴とする請求項５または６に記載の方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、各実行可能なモジュールがその信憑性が確認された他の実行可能なモジュールにのみ動的にリンクされうるように実行可能なモジュールの使用を制限するシステム及び方法に関する。
【０００２】
【従来の技術】
コンピュータ・プログラムのコンテキストでは、“外部機能”は、一般に外部機能を用いているコンピュータ・プログラムの外側にある機能の他のレポジトリまたはライブラリに位置決めされる手順または機能である。外部機能は、常時ではなく、しばしば、異なる人々によってまたはそれらの外部機能を用いているコンピュータ・プログラムとは異なるエンティティによってオーサされる。
外部機能をリンク時間またはコンパイル時間ではなく、走行時間でバウンド（拘束）させるプログラム実行環境は、他のモジュールが変更されないままでありうる間に、そのような実行環境で用いられるべきそのようなプログラムに対して改訂されるかまたは更新されるコンピュータ・プログラムだけがリコンパイルされる必要があるので、コンピュータ・プログラムの保守及び更新を容易にする。更に、改訂されたプログラムのコンパイレーションがプログラムによって用いられる他のモジュールがプログラム開発システムに存在しないでも実行されうるので、リコンパイレーション処理は、簡略化される。
【０００３】
しかしながら、そのようなプログラム実行環境を用いているシステムは、プログラム・モジュール間のインターフェイスが通常よく特定されるか、または第三者によって決定することができ、かつそのような第三者が従ってそれらのプログラム・モジュールを対応ソフトウェア・ライセンス協定によって是認されない方法で用いることが可能なので、無防備である。代替的に、そのような第三者は、信頼できるプログラム・モジュールを破損されたもので置換することによってシステムを覆させることができる。
【０００４】
【発明が解決しようとする課題】
この問題は、アメリカ合衆国から他の国の顧客または販売代理店への輸出向けソフトウェアにおける暗号ルーチンを取り扱うときに誇張される。一般的な暗号ケイパビリティを供給するソフトウェア・モジュールを輸出することは、現在米国貿易法によって禁止されている。他方、制限されたコンテキストにおいて暗号ケイパビリティを使用しかつ輸出されたプログラムの制限されたコンテキスト以外の一般的な暗号機能を実行するために用いることができないプログラムを輸出することは、許されている。事実、許可された方法で暗号機能を用いる輸出用ソフトウェア・システムを設計できることは、商業的に重要である。ダイナミック・リンク・ライブラリ（ウィンドウズ(Windows) システムにおけるＤＬＬｓ）または共有オブジェクト（Solaris における.so ファイル）のような、従来技術のレート・バウンド(late bound)システムは、ソフトウェア・モジュール間のインターフェイスを覆い隠す（曖昧にする）ことによって、またはそれらのソフトウェアの個別“輸出専用”版を供給することによってこの問題を解決することを試みる。ソフトウェア製品の個別“輸出専用”版を供給することは、単一のコード・ベースを有するグレードアップ及び保守改訂に関して“同期”された国内及び輸出版を維持することの問題を導く。
【０００５】
動的にリンク可能なモジュールの使用を制限または防止することの必要が存在する情況の別の例は、トレード・シークレットまたは契約上の理由に対してプライベートなアプリケーションにおいてある機能を維持することを望むベンダーによって書かれたアプリケーションである。そのようなシステムは、これらのプライベート機能への限定付きアクセスを必要とする。
本発明の目的は、上記従来の技術における問題点に鑑みて、動的にリンク可能なモジュールの使用を制限または防止するシステム及び方法を提供することである。
【０００６】
【課題を解決するための手段】
本発明の上記目的は、（Ａ）指定されたプログラム・モジュールの信憑性を確認することによってかつ各そのような手順呼出しに応じて検証確認または否認をリターンすることによってプログラム・モジュール・ベリファイアへの手順呼出しに応答するように構成されるプログラム・モジュール・ベリファイアと、（Ｂ）第１のプログラム・モジュールと、（Ｃ）第２のプログラム・モジュールとを備え、第１及び第２のプログラム・モジュールの一つは、当該第１及び第２のプログラム・モジュールへの手順呼出しを含み、第１及び第２のプログラム・モジュールの少なくとも一つは、前記第１及び第２のプログラム・モジュールの内で当該第１及び第２のプログラム・モジュールの前記少なくとも一つとは他のものであるプログラム・モジュールの信憑性を確認するためのプログラム・モジュール・ベリファイアへの手順呼出しと、プログラム・モジュール・ベリファイアへの手順呼出しがプログラム・モジュール・ベリファイアによってリターンされる検証否認を結果として生ずるときに一つのプログラム・モジュールの実行を中止する命令とを含んでいるコンピュータ・システムによって達成される。
【０００７】
本発明のコンピュータ・システムでは、第１のプログラム・モジュールは、第１のディジタル署名及び第１の実行可能手順を含み、第２のプログラム・モジュールは、第２のディジタル署名及び第２の実行可能手順を含み、プログラム・ベリファイア・モジュールは、（Ａ１）指定されたプログラム・モジュールのディジタル署名を対応復号キーで復号し、（Ａ２）所定のメッセージ・ダイジェスト関数に従って指定されたプログラム・モジュールの少なくとも一部分のメッセージ・ダイジェストを生成し、（Ａ３）復号されたディジタル署名がメッセージ・ダイジェストにマッチするときに検証確認をリターンし、（Ａ４）復号されたディジタル署名がメッセージ・ダイジェストにマッチしないときに検証否認をリターンすることによって、第１及び第２のプログラム・モジュールの指定されたものの検証を要求している手順呼出しに応答するための命令を含むように構成してもよい。
【０００８】
本発明のコンピュータ・システムでは、第１のプログラム・モジュールは、第２のプログラム・モジュールへの手順呼出しを含んでおり；第２のプログラム・モジュールは、（Ｃ１）第２のプログラム・モジュールへの手順呼出しに応答して実行されるべき実行可能手順；（Ｃ２）実行可能手順の実行より前に実行されるように第２のプログラム・モジュールに論理的に配置されるプログラム・モジュール・ベリファイアへの手順呼出し；及び（Ｃ３）プログラム・モジュール・ベリファイアへの手順呼出しがプログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに実行可能手順の実行を防ぐ命令を含んでいるように構成してもよい。
本発明のコンピュータ・システムでは、第２の実行可能手順の実行の終了を防ぐ命令は、プログラム・モジュール・ベリファイアへの手順呼出しが、プログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに第２のプログラム・モジュールの実行を中止する命令を含むように構成してもよい。
【０００９】
本発明のコンピュータ・システムでは、第１のプログラム・モジュールは、第２のプログラム・モジュールへの手順呼出し；第２のプログラム・モジュールへの手順呼出しの実行より前に実行されるように第１のプログラム・モジュールに論理的に配置されるプログラム・モジュール・ベリファイアへの手順呼出し；及びプログラム・モジュール・ベリファイアへの手順呼出しがプログラム・モジュール・ベリファイアによってリターンされる確認否認を結果として生ずるときに第２のプログラム・モジュールへの手順呼出しの実行を防ぐ命令を含んでいるように構成してもよい。
また、本発明の上記目的は、プログラム・モジュールをリンクする方法であって、（Ａ）第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを行うより前に、第２のプログラム・モジュールの信憑性を確認し；（Ｂ）第２のプログラム・モジュールの信憑性を確認することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを行い；かつ（Ｃ）第１のプログラム・モジュールの信憑性を確認することに失敗することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを防ぐ段階を具備する方法によって達成される。
【００１０】
本発明の方法では、（Ｄ）第１のプログラム・モジュールにより手順呼出しに応じて第２のプログラム・モジュールにおいて手順を実行することを終了するより前に、第１のプログラム・モジュールの信憑性を確認し；（Ｅ）第１のプログラム・モジュールの信憑性を確認することにより、結果を生成するために第２のプログラム・モジュールにおいて手順を実行することを終了しかつ結果を第１のプログラム手順にリターンし；かつ（Ｆ）第１のプログラム・モジュールの信憑性を確認することに失敗することにより、第２のプログラム・モジュールにおける手順の実行の終了を防ぐ段階を更に具備してもよい。
本発明の方法では、段階（Ｄ）は、対応するデコーディング・キーで第１のプログラム・モジュールにおける第１のディジタル署名をデコードし、所定のメッセージ・タイジェスト機能に従って第１のプログラム・モジュールの少なくとも一部のメッセージ・ダイジェストを生成し、デコードされたディジタル署名がメッセージ・ダイジェストに一致するときに第１のプログラム・モジュールの信憑性を確認し、かつデコードされたディジタル署名がメッセージ・ダイジェストに一致しないときに第１のプログラム・モジュールの信憑性の確認を否認することを含んでもよい。
【００１１】
本発明の方法では、段階（Ｃ）は、第１のプログラム・モジュールの実行を中止することを含んでもよい。
本発明の方法では、第１のプログラム・モジュールは、第１のディジタル署名を含みかつ第２のプログラム・モジュールは、第２のディジタル署名を含み；段階（Ａ）は、対応するデコーディング・キーで第２のプログラム・モジュールにおける第２のディジタル署名をデコードし、所定のメッセージ・タイジェスト機能に従って第２のプログラム・モジュールの少なくとも一部のメッセージ・ダイジェストを生成し、デコードされたディジタル署名がメッセージ・ダイジェストに一致するときに第２のプログラム・モジュールの信憑性を確認し、かつデコードされたディジタル署名がメッセージ・ダイジェストに一致しないときに第２のプログラム・モジュールの信憑性の確認を否認することを含んでもよい。
【００１２】
本発明の方法では、段階（Ａ）は、第２のプログラム・モジュールの信憑性を確認することによりかつ手順呼出しに応じて確認認証または否認をリターンすることによって手順呼出しに応答している信用プログラム・モジュール・ベリファイアへの手順呼出しを行うことを含んでもよい。
【００１３】
【作用】
纏めると、本発明は、プログラム・モジュール・ベリファイア及び少なくとも第１及び第２のプログラム・モジュールを有しているコンピュータ・システムである。プログラム・モジュールのそれぞれは、ディジタル署名及び実行可能手順を含む。第１のプログラム・モジュールは、第２の手順モジュールへの手順呼出しと、第２のプログラム・モジュールへの手順呼出しの実行より前に実行されるように第１のプログラム・モジュールに論理的に配置されるプログラム・モジュール・ベリファイアへの手順呼出しと、プログラム・モジュール・ベリファイアへの手順呼出しがプログラム・モジュール・ベリファイアによってリターンされる検証否認を結果として生ずるときに第２のプログラム・モジュールへの手順呼出しの実行を防止する命令とを更に含む。
【００１４】
第２のプログラム・モジュールは、第２のプログラム・モジュールに対する第１のプログラム・モジュールによる手順呼出しに応じて実行されるべき実行可能手順と、第２のプログラム・モジュールの実行可能手順の実行の終了より前に実行されるように第２のプログラム・モジュールに論理的に配置されるプログラム・モジュール・ベリファイアへの手順呼出しと、プログラム・モジュール・ベリファイアが第１のプログラム・モジュールに関する検証否認をリターンするときにその実行可能手順の実行の終了を防止する命令とを含む。
プログラム・モジュール・ベリファイアは、指定されたプログラム・モジュールの信憑性を確認することによってかつ各そのような手順呼出しに応じて検証確認または否認をリターンすることによって手順呼出しに応答する。より特定的には、好ましい実施例では、プログラム・ベリファイア・モジュールは、（Ａ）対応復号キーを有する指定されたプログラム・モジュールにおけるディジタル署名を復号し、（Ｂ）メッセージ・ダイジェスト機能に従って指定されたプログラム・モジュールの少なくとも一部分のメッセージ・ダイジェストを生成し、（Ｃ）復号されたディジタル署名がメッセージ・ダイジェストにマッチするときに検証確認をリターンし、（Ｄ）復号されたディジタル署名がメッセージ・ダイジェストとマッチしないときに検証否認をリターンすることによって指定されたプログラム・モジュールの検証を要求している手順呼出しに応答する命令を含む。
【００１５】
好ましい実施例では、プログラム・モジュール・ベリファイアが第２のプログラム・モジュールの信憑性を確認することに失敗したときに、第１のプログラム・モジュールは、例外を投じてその実行を中止させる。同様に、プログラム・モジュール・ベリファイアが第１のプログラム・モジュールの信憑性を確認することに失敗したときに、第２のプログラム・モジュールは、例外を投じてその実行を中止させる。
本発明の更なる目標及び特徴は、添付した図面を参照して以下の詳細の説明及び特許請求の範囲からより容易に明らかであろう。
【００１６】
【実施例】
図１を参照すると、コンピュータ・システム１００が示されている。コンピュータ１００は、Ｓｕｎ（サン）ワークステーション、ＩＢＭコンパチブル・コンピュータ、またはＭａｃｉｎｔｏｓｈ（マッキントッシュ）コンピュータのようなデスクトップ・コンピュータでありうると同時に、ほとんどあらゆる型のコンピュータを用いることができる。コンピュータ１００は、ＣＰＵ１０２、ユーザ・インターフェイス１０４、及びメモリ１０６を含む。メモリ１０６は、１次ランダム・アクセス・メモリ（ＲＡＭ）並びに２次メモリ、一般的に一つ以上の磁気または光ディスクを含む。メモリ１０６は、オペレーティング・システム１１０、プログラム・モジュールまたはオブジェクト信憑性ベリファイア１１２、及び、プログラム・モジュールまたはアプリケーション・プログラム・モジュールとも呼ばれる、一組のアプリケーション・プログラム・オブジェクト・インスタンス生成１１４、１１６、１１８、１２０を記憶する。
【００１７】
図１に示すように、本発明の好ましい実施例では、各アプリケーション・プログラム・オブジェクト・インスタンス生成は、オブジェクト・ヘッダ１２２、少なくとも一つのディジタル署名１２４、少なくとも一つの組込み型パブリック（公開）暗号キー１２６及び（方法としばしば呼ばれる）主アプリケーション手順１２８を含む。各方法または手順１２８は、少なくとも一つのベリファイア手順呼出し命令１３０、及び手順の実行を中止するための命令のような、ベリファイア手順呼出しに応じて受け取った検証否認メッセージに応答するための命令１３２を含む。第１のプログラム・モジュールの主アプリケーションＡ手順（１２８−Ａ）は、第２の手順モジュールの実行可能手順（例えば、主アプリケーションＢ手順１２８−Ｂ）への手順呼出し１３４を更に含む。プログラム・モジュール・ベリファイアへの手順呼出し１３０−Ａは、第２のプログラム・モジュールへの手順呼出し１３４の実行より前に実行されるように第１のプログラム・モジュールに論理的に配置される。
【００１８】
プログラム・モジュール・ベリファイアへの手順呼出し１３０−Ｂは、各そのような手順１２８−Ｂの実行より前に実行されるように第２のプログラム・モジュールの各実行可能手順１２８−Ｂへのエントリ点の直後に第２のプログラム・モジュールに論理的に配置される。より一般的に、本発明の他の実施例では、プログラム・モジュール・ベリファイアへの手順呼出し１３０−Ｂは、呼出しプログラムの検証がベリファイアによって否認されるならば各そのような手順の実行の終了を防止するように第２のプログラム・モジュールの各実行可能手順における終了点より前に第２のプログラム・モジュールに（より一般的には、他のプログラム・モジュールによって呼出される全てのプログラム・モジュールに）論理的に配置される。
【００１９】
本発明の好ましい実施例では、特定のトップ・レベル・アプリケーションまたはトップ・レベル・アプリケーションのスーツによって使用される全ての手順のような、指定されたグループの全ての手順は、同じ組込み型パブリック・キー１２６を有しかつ全ては、同じプライベート暗号キーを用いて、例えば、ＲＳＡ暗号方法を用いてディジタル的に署名される。しかしながら、代替実施例では、異なる手順及び手順のサブグループは、異なるプライベート・キーで署名される。代替実施例では、手順呼出しを含む手順モジュールは、それらが呼出すことができる手順の検証のためのパブリック・キーを組込み、かつ他の手順によって呼出すことができる全ての手順モジュールは、呼出し手順の検証のためのパブリック・キーを含む。
【００２０】
図２は、一般の手順呼出しが本発明の好ましい実施例を用いてどのように実行されるかを示す“時間線”表現である。図２では、早期事象(ealier events) は、後期事象(later events)よりも高い垂直位置に示される。図３及び図４は、手順呼出しの性能に含まれる段階のフローチャートである。
図２、図３及び図４を参照すると、プログラム・モジュールＡの実行可能手順（例えば、図１の“主アプリケーションＡ手順”１２８−Ａ）は、実行を開始する（ステップ２００）。この説明の目的のために、実行されているプログラム・モジュールＡの手順は、“手順Ａ”と呼ばれかつそれがプログラム・モジュールＢで呼出すことを試みている手順は、“手順Ｂ”と呼ばれる。
プログラム・モジュールＢの実行可能手順への手順呼出しを行う前に（ステップ２２０）、手順Ａは、プログラム・モジュールＢの信憑性の検証を要求するためにベリファイアへの手順呼出しを行う（ステップ２０２）。次いでベリファイアは、プログラム・モジュールＢの信憑性を確認することを試み、かつプログラム・モジュールＢの検証が成功したか否かを示すために手順Ａへリターン値を送る（ステップ２０４）。
【００２１】
より特定的には、明確な信用オブジェクト（または代替的に信用システム・サービス手順）であるのが好ましい、ベリファイアは、手順Ａから要求メッセージを受け取り（ステップ２０６）、かつ呼出し手順（即ち、手順Ａ）によって供給されるパブリック・キーを用いてプログラム・モジュールＢに組込まれたディジタル署名を復号する（ステップ２０８）。ベリファイアへの手順Ａを呼出すことによって供給されたパブリック・キーは、プログラム・モジュールＡに組込まれた“グループ”パブリック・キー１２６−Ａである。
好ましい実施例では、プログラム・モジュールのディジタル署名は、プログラム・モジュールのメッセージ・ダイジェストを計算し、メッセージ・ダイジェストを生成するために用いられるハッシュ関数の型を示すためにハッシュ関数識別子でメッセージ・ダイジェストを補足し、ＲＳＡ暗号方法を用いてプライベート・キーで合成値を暗号化し、そしてプログラム・モジュールのソース（即ち、オーサまたはディストリビュータ）のクリア・テキスト識別子でその暗号化された値を補足することによって生成される：
【００２２】
0003982857.tif 000002
従って、プログラム・モジュールＢのディジタル署名を復号するために、ベリファイアは、（Ａ）ディジタル署名からクリア・テキストＩＤを除去し、そして（Ｂ）署名ベース・メッセージ・ダイジェストＤＳ−ＭＤB 及びハッシュ関数ＩＤを生成するためにパブリック・キーでディジタル署名の残っている部分を復号する。
【００２３】
0003982857.tif 000003
次に、ベリファイアは、復号されたディジタル署名で識別されたハッシュ関数を用いてプログラム・モジュールＢ（ステップ２１０）の少なくとも一部分のメッセージ・ダイジェストＭＤB を計算する。メッセージ・ダイジェストを生成するために用いられるハッシュ関数は、一般に、非常に高い確率で別個のプログラム・モジュールに対して別個の値を生成することが知られている、ＣＲＣ復号関数のような、関数である。メッセージ・ダイジェストを生成するために適する多くのハッシュ関数は、当業者に知られている。
【００２４】
ベリファイアは、次いで、計算されたメッセージ・ダイジェストＭＤB を復号されたディジタル署名のメッセージ・ダイジェストＤＳ−ＭＤB と比較し（ステップ２１２）かつ二つのメッセージ・ダイジェストがマッチしたならば検証確認メッセージを呼出し手順へリターンし（ステップ２１４）、二つのメッセージ・ダイジェストがマッチしないならば検証否認メッセージをリターンする（ステップ２１６）。
一つの好ましい実施例では、各プログラム・モジュールに対して単一のディジタル署名が存在し、かつ関連メッセージ・ダイジェストは、プログラム・モジュールの内容全体のハッシュ関数を用いて計算される。他の実施例では、メッセージ・ダイジェストは、プログラム・モジュールの一部分だけに基づきうる。例えば、第２の好ましい実施例では、各プログラム・モジュールは、二つのディジタル署名、即ち、プログラム・モジュールの方法部分に対して一つ、プログラム・モジュールのデータ部分（もしあれば）に対して別のものを有する。プログラム・モジュールが二つのディジタル署名を有するときには、二つのディジタル署名を復号することによって導出されたメッセージ・ダイジェストの両方は、ベリファイアが検証確認メッセージをリターンするためにベリファイアによって計算された対応メッセージ・ダイジェストにマッチしなければならない。いずれかの復号されたディジタル署名のメッセージ・ダイジェストがベリファイアによって計算された対応メッセージ・ダイジェストにマッチしないならば、ベリファイアは、検証否認メッセージをリターンする。
【００２５】
ベリファイアがプログラム・モジュールＢの検証を否認するならば（ステップ２１６）、手順Ａは、“例外を投入し”そして中止する（ステップ２１８）。例外を投入することは、一般に実行の関連スレッドを終了させて、更に実行の呼出しスレッドに、呼出された手順（即ち、この場合には手順Ａ）の故障（失敗）を解析するかさもなくばそれに応答する機会を与えるように例外ハンドラー手順を実行の呼出しスレッドによって実行させる。
一般に、ベリファイアは、一つのコンピュータから別のものへの導入または送信の間中、または故意に不正変更されたように、プログラム・モジュールが破損されたときにのみプログラム・モジュールの検証を否認する。通常のオペレーションでは、検証否認は、異常な事象であるべきである。
【００２６】
ベリファイアがプログラム・モジュールＢの検証を確認したならば（ステップ２１４）、手順Ａは、プログラム・モジュールＢにおける手順Ｂへの手順呼出しを行うことを進める（ステップ２２０）。好ましい実施例では、手順呼出しを受け取ることにより手順Ｂが行う一番最初の事の一つは、ベリファイアへの手順呼出しを行うことであり（ステップ２２２）、呼出しプログラム・モジュール（即ち、この場合にはプログラム・モジュールＡ）の信憑性を確認するための要求をそれに送る。
次いで、ベリファイアは、プログラム・モジュールＡの信憑性を確認することを試みかつプログラム・モジュールＡの検証が成功であったか否かを示すために手順Ｂへリターン値を送る（ステップ２３０）。
【００２７】
より特定的には、ベリファイアは、手順Ｂから要求メッセージを受け取り（ステップ２３２）、かつ手順Ｂによって供給されたパブリック・キーを用いてプログラム・モジュールＡに組込まれたディジタル署名を復号し（ステップ２３４）。ベリファイアへ手順Ｂによって供給されたパブリック・キーは、プログラム・モジュールＢに組込まれた“グループ”パブリック・キー１２６−Ｂである。
上述したように、プログラム・モジュールＡのディジタル署名は、プログラム・モジュールＡのメッセージ・ダイジェストを計算し、メッセージ・ダイジェストを生成するために用いられたハッシュ関数の型を示すためにメッセージ・ダイジェストをハッシュ関数識別子で補足し、ＲＳＡ暗号化方法を用いて合成値をプライベート・キーで暗号化し、そしてその暗号化された値をプログラム・モジュールのソース（即ち、オーサまたはディストリビュータ）のクリア・テキスト識別子で補足することによって生成される：
【００２８】
0003982857.tif 000004
従って、プログラム・モジュールＡのディジタル署名を復号するために、ベリファイアは、（Ａ）ディジタル署名からクリア・テキストＩＤを除去し、そして（Ｂ）署名ベース・メッセージ・ダイジェストＤＳ−ＭＤA 及びハッシュ関数ＩＤを生成するためにパブリック・キーでディジタル署名の残っている部分を復号する。
【００２９】
0003982857.tif 000005
次に、ベリファイアは、復号されたディジタル署名で識別されたハッシュ関数を用いてプログラム・モジュールＡ（ステップ２３６）の少なくとも一部分のメッセージ・ダイジェストＭＤA を計算する。
ベリファイアは、次いで、計算されたメッセージ・ダイジェストＭＤA を復号されたディジタル署名のメッセージ・ダイジェストＤＳ−ＭＤA と比較し（ステップ２３８）かつ二つのメッセージ・ダイジェストがマッチしたならば検証確認メッセージを呼出し手順へリターンし（ステップ２４０）、二つのメッセージ・ダイジェストがマッチしないならば検証否認メッセージをリターンする（ステップ２４２）。
ベリファイアがプログラム・モジュールＡの検証を否認するならば（ステップ２１６）、手順Ｂは、“例外を投入し”そして中止する（ステップ２４４）。
ベリファイアがプログラム・モジュールＡの検証を確認したならば（ステップ２４０）、手順Ｂは、終了するために実行され（ステップ２５０）かつ手順Ｂを実行することによって生成された結果は、手順Ａにリターンされる（ステップ２５２）。そして、手順Ａは、手順Ｂから受け取った結果を用いてその実行を終了する（ステップ２５４）。
【００３０】
代替実施例
ある代替実施例では、一群のプログラム・モジュールのプログラム・モジュールの一部分だけが“感知可能な”アルゴリズムまたはさもなくば他のプログラム・モジュールよりも確証するためにどちらがより重要であるかを含む。例えば、第１の代替実施例では、一組のプログラム・モジュール（以下、“プログラム・モジュールのフル・セット”と呼ぶ）のディストリビュータは、グループの少ない数のプログラム・モジュール（以下、“プログラム・モジュールの限定サブセット”と呼ぶ）がグループの他のプログラム・モジュールでのみ用いられることを確実にすることを欲するが、しかしグループ以外のプログラム・モジュールでも、残っているプログラム・モジュールをランセンス取得者により自由に用いらせることを欲する。この実施例では、プログラム・モジュールの限定セットだけが、それらのプログラム・モジュールのエントリ点の直後に論理的に配置された、ベリファイア・モジュールへの手順呼出しを含む。これらのベリファイアへのエントリ点手順呼出しは、呼出しプログラム・モジュールの信憑性を確認するために用いられ、かつ呼出しプログラム・モジュールが確証されたグループの一部分であるという検証により、呼出されたプログラム・モジュールは、呼出しプログラム・モジュールによって要求された計算を実行する。
【００３１】
第２の実施例では、一組のプログラム手順のディストリビュータは、一組の“限定プログラム・モジュール”の使用を限定することを考慮せず、かつ限定プログラム・モジュールのサービスを用いることを試みている全ての呼出し手順が、事実、限定プログラム・モジュールの確証版のサービスを得るということを代わりに考慮する。この実施例では、限定プログラム・モジュールへの手順呼出しを行っている全ての手順は、限定プログラム・モジュールへの手順呼出しの直前に論理的に配置されたベリファイア・モジュールへの手順呼出しを含む。これらのベリファイア手順呼出しは、限定プログラム・モジュールの信憑性を確認するために用いられる。しかしながら、この実施例では、限定プログラム・モジュールの手順は、呼出しプログラム・モジュールを確証するためのベリファイア手順呼出しを含んでいない。呼出されるべき限定プログラム・モジュールが信用できるという検証により、呼出しプログラム・モジュールは、確証された限定プログラム・モジュールへその手順呼出しを送る。
【００３２】
本発明は、２〜３の特定実施例を参照して説明されたが、その記載は、本発明の説明のためであり、本発明を限定することを意図しない。特許請求の範囲によって画定された本発明の真の精神及び範疇から逸脱することなく当業者によって種々の変更が生起されうる。
【００３３】
【発明の効果】
本発明のコンピュータ・システムは、（Ａ）指定されたプログラム・モジュールの信憑性を確認することによってかつ各そのような手順呼出しに応じて検証確認または否認をリターンすることによってプログラム・モジュール・ベリファイアへの手順呼出しに応答するように構成されるプログラム・モジュール・ベリファイアと、（Ｂ）第１のプログラム・モジュールと、（Ｃ）第２のプログラム・モジュールとを備え、第１及び第２のプログラム・モジュールの一つは、当該第１及び第２のプログラム・モジュールへの手順呼出しを含み、第１及び第２のプログラム・モジュールの少なくとも一つは、前記第１及び第２のプログラム・モジュールの内で当該第１及び第２のプログラム・モジュールの前記少なくとも一つとは他のものであるプログラム・モジュールの信憑性を確認するためのプログラム・モジュール・ベリファイアへの手順呼出しと、プログラム・モジュール・ベリファイアへの手順呼出しがプログラム・モジュール・ベリファイアによってリターンされる検証否認を結果として生ずるときに一つのプログラム・モジュールの実行を中止する命令とを含んでいるので、動的にリンク可能なモジュールの使用を制限し或いは防止することができる。
【００３４】
本発明の方法は、プログラム・モジュールをリンクする方法であって、（Ａ）第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを行うより前に、第２のプログラム・モジュールの信憑性を確認し；（Ｂ）第２のプログラム・モジュールの信憑性を確認することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを行い；かつ（Ｃ）第１のプログラム・モジュールの信憑性を確認することに失敗することにより、第１のプログラム・モジュールから第２のプログラム・モジュールへの手順呼出しを防ぐ段階を具備するので、動的にリンク可能なモジュールの使用を制限し或いは防止することができる。
【図面の簡単な説明】
【図１】  本発明を組み込んでいるコンピュータ・システムのブロック図である。
【図２】  本発明の好ましい実施例を用いて一般的な手順呼出しが実行される方法を示している“タイム・ライン”表現である。
【図３】  互いの信憑性を確認するために二つのリンクされたソフトウェア・モジュールに対して好ましい実施例で用いられる方法のフローチャートの一部分である。
【図４】  図３に示した方法の他の部分を示すフローチャートである。
【符号の説明】
１００  コンピュータ・システム
１０２  ＣＰＵ
１０４  ユーザ・インターフェイス
１０６  メモリ
１１０  オペレーティング・システム
１１２  オブジェクト信憑性ベリファイア
１１４、１１６  アプリケーション・プログラム・モジュール
１１８、１２０  アプリケーション・プログラム・モジュール
１２２−Ａ、１２２−Ｂ  オブジェクト・ヘッダ
１２４−Ａ、１２４−Ｂ  ディジタル署名
１２６−Ａ、１２６−Ｂ  パブリック暗号キー
１２８−Ａ、１２８−Ｂ  主アプリケーション手順
１３０−Ａ、１３０−Ｂ  ベリファイア手順呼出し命令
１３２−Ａ、１３２−Ｂ  検証否認メッセージに応答するための命令
１３４  第２の手順モジュールの実行可能手順への手順呼出し
【図１】
0003982857.tif 000006
【図２】
0003982857.tif 000007
【図３】
0003982857.tif 000008
【図４】
0003982857.tif 000009