(57)【要約】【課題】エラー解析における手間を少なくする。【解決手段】本発明の一態様は、所定プログラムが搭載された記憶部と、前記プログラムを実行する制御部とを備え、前記プログラムはエラー処理への分岐部を備え、前記制御部は、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定されたユニークな番号を前記記憶部の所定領域に書き込む半導体装置である。【選択図】図１
2020119328.tif 000002
【特許請求の範囲】
【請求項１】
所定プログラムが搭載された記憶部と、
前記プログラムを実行する制御部と
を備え、
前記プログラムはエラー処理への分岐部を備え、
前記制御部は、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定されたユニークな番号を前記記憶部の所定領域に書き込む
半導体装置。
【請求項２】
前記制御部が、前記所定領域からの前記ユニークな番号の読み出しを指示する専用のコマンドに応じて、前記所定領域から前記ユニークな番号を読み出して出力する
請求項１に記載の半導体装置。
【請求項３】
前記制御部が、所定の認証処理によって正当性が確認された場合に前記所定領域から前記ユニークな番号を読み出して出力する
請求項２に記載の半導体装置。
【請求項４】
前記半導体装置が、ＩＣカードである
請求項１から３のいずれか１項に記載の半導体装置。
【請求項５】
所定プログラムが搭載された記憶部と、
前記プログラムを実行する制御部と
を備える半導体装置において、
前記プログラムがエラー処理への分岐部を備え、
前記制御部に、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定された前記ユニークな番号を前記記憶部の所定領域に書き込む処理を実行させる
制御方法。
【請求項６】
所定プログラムが搭載された記憶部と、
前記プログラムを実行する制御部と
を備える半導体装置において、
前記プログラムがエラー処理への分岐部を備え、
前記制御部に、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定された前記ユニークな番号を前記記憶部の所定領域に書き込む処理を実行させる
前記プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体装置、制御方法、およびプログラムに関する。
【背景技術】
【０００２】
特許文献１に記載されているシステムでは、ＩＣカードのコマンドに対するレスポンスが無応答となる異常（以下、ＨＡＬＴ）となる場合に、ＣＰＵレジスタ情報通知機能によって、ＣＰＵレジスタの値やプログラムカウンタのカウンタ値が、外部の端末（リーダライタなど）へ通知される。あるいは、特許文献１に記載されているシステムでは、ＣＰＵレジスタ情報保持機能によって、ＨＡＬＴの実行指示に応じてＣＰＵレジスタの値やプログラムカウンタのカウンタ値が不揮発性メモリに記憶され、また、外部の端末からのコマンドに応じて記憶された情報が返送される。これらの構成によれば、ＨＡＬＴ処理のモジュールがコールされたタイミング等について後から解析が可能となる。
【０００３】
従来のＩＣカードでは、エラーを検知した際に、エラーステータスというレスポンスを応答するか、またはカードロックや無応答状態に遷移する（図１０〜図１２）。図１０はエラーステータス応答の処理の流れの一例を示す図である。図１１はカードロックの処理の流れの一例を示す図である。図１２はカードＨＡＬＴ処理の流れの一例を示す図である。なお、図１０〜図１２において破線より左側の処理が、リーダライタ（Ｒ／Ｗ）が行う処理であり、破線より右側の処理が、ＩＣカードが行う処理である。
【０００４】
図１０に示すエラーステータス応答の処理では、リーダライタがコマンドを送信すると（ステップＳ１０１）、ＩＣカードがコマンドを受信し（ステップＳ１０２）、受信したコマンドに応じた処理を実行する（ステップＳ１０３）。ＩＣカードは、コマンドに応じた処理の実行時にエラーが発生した場合（ステップＳ１０４で「ＹＥＳ」の場合）、エラーステータスを送信する（ステップＳ１０５）。そして、リーダライラがエラーステータスを受信する（ステップＳ１０６）。リーダライタ側では、エラーステータスの意味よってエラー解析を行うことができる。なお、エラーステータスとは、コマンドが実行したエラーの種類によって、各コマンドで共通な意味を示す２バイトのレスポンスデータである。各エラーステータスが示す意味を調べることによって、問題が発生した原因を推測することができる。
【０００５】
また、図１１に示すカードロックの処理では、リーダライタがコマンドを送信すると（ステップＳ１１１）、ＩＣカードがコマンドを受信し（ステップＳ１１２）、受信したコマンドに応じた処理を実行する（ステップＳ１１３）。ＩＣカードは、コマンドに応じた処理の実行時に悪意攻撃の可能性を検知した場合（ステップＳ１１４で「ＹＥＳ」の場合）、カードをロックし（ステップＳ１１５）、カード無応答に遷移する（ステップＳ１１６）。
【０００６】
また、図１２に示すカードＨＡＬＴ処理では、リーダライタがコマンドを送信すると（ステップＳ１２１）、ＩＣカードがコマンドを受信し（ステップＳ１２２）、受信したコマンドに応じた処理を実行する（ステップＳ１２３）。ＩＣカードは、コマンドに応じた処理の実行時にエラーが発生した場合（ステップＳ１２４で「ＹＥＳ」の場合）、カード無応答に遷移する（ステップＳ１２５）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１３−１７１３９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ＩＣカードで動作するアプリケーションプログラム（カードアプリケーション）の開発は一般に高級言語を用いて行われる。この場合、エラーが発生した場合の解析は、高級言語のソースプログラム（ソースコード）に基づいて行われる。アセンブリ言語のようにソースプログラムの記述が機械語の命令に一対一で対応している場合、ＣＰＵレジスタの値やプログラムカウンタのカウンタ値を直接的に用いてソースプログラムに基づきエラーを解析することができる。しかしながら、高級言語では、ソースプログラムの記述と機械語の命令は一対一で対応していないため、ＣＰＵレジスタの値やプログラムカウンタのカウンタ値を直接的に用いてエラーを解析することはできない。そのため、ＣＰＵレジスタの値やプログラムカウンタのカウンタ値に基づくエラー解析ではソースプログラムとの対応づけに手間が掛かることがあるという課題があった。
【０００９】
本発明は、上記事情を考慮してなされたものであり、エラー解析における手間を少なくすることができる半導体装置、制御方法、およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題を解決するため、本発明の一態様は、所定プログラムが搭載された記憶部と、前記プログラムを実行する制御部とを備え、前記プログラムはエラー処理への分岐部を備え、前記制御部は、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定されたユニークな番号を前記記憶部の所定領域に書き込む半導体装置である。
【００１１】
また、本発明の一態様は、上記半導体装置であって、前記制御部が、前記所定領域からの前記ユニークな番号の読み出しを指示する専用のコマンドに応じて、前記所定領域から前記ユニークな番号を読み出して出力する。
【００１２】
また、本発明の一態様は、上記半導体装置であって、前記制御部が、所定の認証処理によって正当性が確認された場合に前記所定領域から前記ユニークな番号を読み出して出力する。
【００１３】
また、本発明の一態様は、上記半導体装置であって、前記半導体装置が、ＩＣカードである。
【００１４】
また、本発明の一態様は、所定プログラムが搭載された記憶部と、前記プログラムを実行する制御部とを備える半導体装置において、前記プログラムがエラー処理への分岐部を備え、前記制御部に、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定された前記ユニークな番号を前記記憶部の所定領域に書き込む処理を実行させる制御方法である。
【００１５】
また、本発明の一態様は、所定プログラムが搭載された記憶部と、前記プログラムを実行する制御部とを備える半導体装置において、前記プログラムがエラー処理への分岐部を備え、前記制御部に、前記分岐部によって前記プログラムの進行をエラー処理に分岐させた場合に、当該分岐部に設定された前記ユニークな番号を前記記憶部の所定領域に書き込む処理を実行させる前記プログラムである。
【発明の効果】
【００１６】
本発明の各態様によれば、所定領域に記憶されているユニークな番号を読み出すことで、直接的に分岐部を特定することができるので、エラー解析における手間を少なくすることができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の一実施形態に係るシステムの概略構成を示すブロック図である。
【図２】本発明の一実施形態に係るシステムのソースプログラムの記述例を示す図である。
【図３】本発明の一実施形態に係るシステムの動作例を示す図である。
【図４】図３に示すｓｅｌｅｃｔコマンド処理（ステップＳ１３）の構成例を示すフローチャートである。
【図５】図４に示す処理Ａ（ステップＳ１４）の構成例を示すフローチャートである。
【図６】図４および図５に示すエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（ステップＳ２４、ステップＳ２７、ステップＳ２９、ステップＳ３４、ステップＳ３７、およびステップＳ３９）の構成例を示すフローチャートである。
【図７】本発明の一実施形態に係るシステムにおいて特殊コマンドでユニークな番号を確認する際の動作例を示すフローチャートである。
【図８】図７に示す認証コマンド処理（ステップＳ６３）の構成例を示すフローチャートである。
【図９】図７に示す特殊コマンド処理（ステップＳ６８）の構成例を示すフローチャートである。
【図１０】エラーステータス応答の処理の流れを示す図である。
【図１１】カードロックの流れの処理の流れを示す図である。
【図１２】カードＨＡＬＴ処理の流れの処理の流れを示す図である。
【発明を実施するための形態】
【００１８】
以下、図面を参照して本発明の一実施形態に係るシステムについて説明する。図１は、本発明の一実施形態に係るシステム１０の概略構成例を示すブロック図である。図１に示すシステム１０は、半導体装置１と、端末２を備える。
【００１９】
半導体装置１は、ＣＰＵ（中央処理装置）、メモリ等を構成する半導体素子を用いたＩＣ（集積回路）を備え、情報を処理および記憶する装置である。半導体装置１は、例えば、ＩＣカード、ＳＩＭカード（Ｓｕｂｓｃｒｉｂｅｒ  Ｉｄｅｎｔｉｔｙ  Ｍｏｄｕｌｅ  Ｃａｒｄ）等である。図１に示す半導体装置１は、制御部１１と、通信部１２と、記憶部１３を備える。
【００２０】
制御部１１は、ＣＰＵ１１１を備え、記憶部１３に記憶されているプログラム３等のプログラムを実行することで所定の処理を行う。
【００２１】
通信部１２は、所定のプロトコルに従って端末２との間で有線または無線の通信を行い、所定の情報を送受信する。
【００２２】
記憶部１３は、ＲＯＭ（リードオンリメモリ）１３１、ＲＡＭ（ランダムアクセスメモリ）１３２、ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  ａｎｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１３３を有する。ＲＯＭ１３１はＣＰＵ１１１が実行するプログラム３等のプログラム等を記憶する。プログラム３は、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ／Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）、オペレーティングシステム、アプリケーションプログラム等のいずれのプログラムであってもよい。なお、プログラム３はＥＥＰＲＯＭ１３３に書き換えできるように記憶されていてもよい。本実施形態においてプログラム３は、エラー処理への複数の分岐部３１と、分岐部３１毎に設定された複数のユニークな番号３２（以下、ユニーク番号３２という）を備える。各分岐部３１は、所定の条件の成否に基づきプログラム３の進行をエラー処理またはエラー処理以外の処理へ分岐させるプログラム（の一部）である。制御部１１は、分岐部３１を実行することでプログラム３の進行をエラー処理に分岐させた場合、当該分岐部３１に設定されたユニーク番号３２を記憶部１３のユニーク番号記憶領域１３３１に書き込む。ユニーク番号３２は分岐部３１毎に異なる固有の番号（識別番号）である。このため、エラーを解析する際には、ユニーク番号記憶領域１３３１に書き込まれたユニーク番号３２を調べることで、エラー処理へプログラム３の進行を分岐させた分岐部３１を特定することができる。なお、ユニーク番号３２は、数字、文字、記号、それらの組み合わせ等から構成することができるまた、ＲＡＭ１３２はメインメモリとして動作する。ＥＥＰＲＯＭ１３３は、不揮発性メモリであり、ユーザデータ等を書き換えできるように記憶する。また、ＥＥＰＲＯＭ１３３は、分岐部３１に設定されたユニーク番号３２を記憶する領域として、ユニーク番号記憶領域１３３１を有している。
【００２３】
なお、半導体装置１の構成は、図１に示す構成に限定されない。例えば、制御部１１と通信部１２と記憶部１３の一部または全部が統合されて構成されていてもよい。また、制御部１１が暗号処理を行うコプロセッサ等を備えていてもよい。また、不揮発性メモリは、フラッシュメモリ等であってもよい。また、ユニーク番号記憶領域１３３１はＲＡＭ１３２内あるいはＲＡＭ１３２内とＥＥＰＲＯＭ１３３内に設けられていてもよい。
【００２４】
端末２は、制御部２１と通信部２２を備える。制御部２１は、図示していない上位制御装置からの指示に基づき、通信部２２を制御する。通信部２２、所定のプロトコルに従って半導体装置１の通信部１２との間で有線または無線の通信を行い、所定の情報を送受信する。端末２は、例えばＩＣカードリーダライタ、スマートフォン等である。上位制御装置は、例えば、パーソナルコンピュータ、ホストサーバ等のコンピュータである。
【００２５】
上述したように、本実施形態の半導体装置１は、プログラム３が搭載された記憶部１３と、プログラム３を実行する制御部１１とを備える。このプログラム３はエラー処理への分岐部３１を備える。そして、制御部１１は、分岐部３１によってプログラム３の進行をエラー処理に分岐させた場合に、当該分岐部３１に設定されたユニーク番号３２を記憶部１３のユニーク番号記憶領域１３３１（所定領域）に書き込む。この構成によれば、ユニーク番号３２を確認することで、エラー発生時にエラー処理へ移行させる分岐を行ったソースプログラム内の箇所を、ユニーク番号３２に基づいて直接的に特定することができる。すなわち、本実施形態によれば、ユニーク番号記憶領域１３３１に記憶されているユニーク番号３２を読み出すことで、直接的に分岐部３１を特定することができ、したがって、エラー解析における手間を少なくすることができる。
【００２６】
次に、図２〜図９を参照して、図１に示すシステム１０の動作例について説明する。なお、以下では、半導体装置１がＩＣカードであり、端末２がリーダライタ（Ｒ／Ｗ）である場合を例として、システム１０の動作例について説明する。この場合、半導体装置１（ＩＣカード）は、基本的な動作として、端末２（リーダライタ）が送信したコマンドを受信して処理し、コマンド処理の結果をレスポンスとして端末２（リーダライタ）へ送信する。
【００２７】
まず、図２〜図６を参照して、図１に示す制御部１１のエラー処理発生時の動作例について説明する。本動作例では、リーダライタ（Ｒ／Ｗ）から受信したコマンドに対する、エラーステータスの送信、カードロックや無応答（ＨＡＬＴ）等のエラー処理の際に、エラー処理を実施するモジュール（関数）をコールする（実行する）箇所すべてにユニーク番号３２が設定される。制御部１１は、コマンドを処理する途中に、エラーが発生する場合、エラー処理関数ｆｕｎｃＥｒｒｏｒ（）を呼び、事前に決められたユニーク番号３２をｆｕｎｃＥｒｒｏｒ（）の引数として渡す。この場合、例えば図２に示すように、ソースプログラム内に、ユニーク番号３２として、定数名を「ＥｒｒｏｒＮｕｍ＿０」、「ＥｒｒｏｒＮｕｍ＿１」、「ＥｒｒｏｒＮｕｍ＿２」、…定義し、定数値「０」、「１」「２」、…を設定する（「＃ｄｅｆｉｎｅ」は定数等の宣言文である。）。図２は、制御部１１が実行するアプリケーションプログラムのソースプログラムの記述例を示す図である。なお、「ｕ８」は符号無し８ビットの整数型を表す。そして、ソースプログラム内に、各エラー処理関数ｆｕｎｃＥｒｒｏｒ（）が、「ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿０）」、「ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿１）」、「ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿２）」、…のように、ユニーク番号３２を引数に設定して記述される。
【００２８】
次に、図３〜図６を参照して、ｓｅｌｅｃｔコマンド（ファイルを選択するコマンド）を一例として用いて、システム１０の動作例について説明する。図３は、図１に示すシステム１０においてｓｅｌｅｃｔコマンドを送受信する際の処理の流れを示す図である。図４は、図３に示すｓｅｌｅｃｔコマンド処理（ステップＳ１３）の構成例を示すフローチャートである。図５は、図４に示す処理Ａ（ステップＳ１４）の構成例を示すフローチャートである。図６は、図４および図５に示すエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（ステップＳ２４、ステップＳ２７、ステップＳ２９、ステップＳ３４、ステップＳ３７、およびステップＳ３９）の構成例を示すフローチャートである。
【００２９】
図３に示すように、端末２（リーダライタ）がｓｅｌｅｃｔコマンドを送信すると（ステップＳ１１）、半導体装置１（ＩＣカード）はｓｅｌｅｃｔコマンドを受信する（ステップＳ１２）。次に、半導体装置１（ＩＣカード）は、受信したｓｅｌｅｃｔコマンドに対する処理を実行する（ステップＳ１３）。ステップＳ１３において制御部１１は、ステップＳ１２で受信したｓｅｌｅｃｔコマンド内の設定情報に応じた引数を設定して図４に示す関数ｆｕｎｃＳｅｌｅｃｔ（）を実行する。
【００３０】
次に、半導体装置１（ＩＣカード）は、ステップＳ１３における処理結果に基づき応答を送信し（ステップＳ１４）、端末２（リーダライタ）が応答を受信する（ステップＳ１５）。ここで、半導体装置１（ＩＣカード）は、送信する応答にステータスワード（ＳＷ）を含めて送信する。ステータスワードは、例えば、正常終了時に「０ｘ９０００」（１６進数）であり、異常終了時に「０ｘ６○○○」（「○」はエラーの内容等に応じて変化する値を示す）である。なお、図３に示す処理の流れは、コマンド処理が正常に終了した場合とエラーが発生してエラーステータスを応答する場合に対応する。ＨＡＬＴやカードロックに移行する場合にはｓｅｌｅｃｔコマンド処理（ステップＳ１３）内で処理が停止し、次の応答送信（ステップＳ１４）は実行されない。
【００３１】
次に、図４を参照して、図３に示すｓｅｌｅｃｔコマンド処理（ステップＳ１３）の構成例について説明する。この場合、ｓｅｌｅｃｔコマンド処理は、関数ｆｕｎｃＳｅｌｅｃｔ（）として構成されていて、ファイルを選択する処理に係る、ある処理Ａ、処理Ｂおよび処理Ｃを含んでいる。図４に示す例では、制御部１１は、まず処理Ａを実行する（ステップＳ２１）。次に、制御部１１は、処理Ａでエラーが発生したか否かを判断する（ステップＳ２２）。処理Ａでエラーが発生しなかった場合（ステップＳ２２で「ＹＥＳ」の場合）、制御部１１は、処理Ｂを実行する（ステップＳ２３）。一方、処理Ａでエラーが発生した場合（ステップＳ２２で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿０を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿０））を実行する（ステップＳ２４）。このステップＳ２２の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿０（＝０）が、ステップＳ２２の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３２】
また、制御部１１は、処理Ｂを実行した場合（ステップＳ２３）、次に、処理Ｂでエラーが発生したか否かを判断する（ステップＳ２５）。処理Ｂでエラーが発生しなかった場合（ステップＳ２５で「ＹＥＳ」の場合）、制御部１１は、処理Ｃを実行する（ステップＳ２６）。一方、処理Ｂでエラーが発生した場合（ステップＳ２５で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿１を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿１））を実行する（ステップＳ２７）。このステップＳ２５の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿１（＝１）が、ステップＳ２５の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３３】
また、制御部１１は、処理Ｃを実行した場合（ステップＳ２６）、次に、処理Ｃでエラーが発生したか否かを判断する（ステップＳ２８）。処理Ｃでエラーが発生しなかった場合（ステップＳ２８で「ＹＥＳ」の場合）、制御部１１は、関数ｆｕｎｃＳｅｌｅｃｔ（）の処理を終了する。一方、処理Ｃでエラーが発生した場合（ステップＳ２８で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿２を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿２））を実行する（ステップＳ２９）。このステップＳ２８の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿２（＝２）が、ステップＳ２８の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３４】
次に、図５を参照して、図４に示す処理Ａ（ステップＳ２１）の構成例について説明する。この場合、処理Ａは、関数ｆｕｎｃＳｅｌｅｃｔＳｕｂＡ（）として構成されていて、ファイルを選択する処理に係る処理Ａを構成する、処理Ａ−１、処理Ａ−２および処理Ａ−３を含んでいる。図５に示す例では、制御部１１は、まず処理Ａ−１を実行する（ステップＳ３１）。次に、制御部１１は、処理Ａ−１でエラーが発生したか否かを判断する（ステップＳ３２）。処理Ａ−１でエラーが発生しなかった場合（ステップＳ３２で「ＹＥＳ」の場合）、制御部１１は、処理Ａ−２を実行する（ステップＳ３３）。一方、処理Ａ−１でエラーが発生した場合（ステップＳ３２で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿３を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿３））を実行する（ステップＳ３４）。このステップＳ３２の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿３が、ステップＳ３２の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３５】
また、制御部１１は、処理Ａ−２を実行した場合（ステップＳ３３）、次に、処理Ａ−２でエラーが発生したか否かを判断する（ステップＳ３５）。処理Ａ−２でエラーが発生しなかった場合（ステップＳ３５で「ＹＥＳ」の場合）、制御部１１は、処理Ａ−３を実行する（ステップＳ３６）。一方、処理Ａ−２でエラーが発生した場合（ステップＳ３５で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿４を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿４））を実行する（ステップＳ３７）。このステップＳ３５の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿４が、ステップＳ３５の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３６】
また、制御部１１は、処理Ａ−３を実行した場合（ステップＳ３６）、次に、処理Ａ−３でエラーが発生したか否かを判断する（ステップＳ３８）。処理Ａ−３でエラーが発生しなかった場合（ステップＳ３８で「ＹＥＳ」の場合）、制御部１１は、関数ｆｕｎｃＳｅｌｅｃｔＳｕｂＡ（）の処理を終了する。一方、処理Ａ−３でエラーが発生した場合（ステップＳ３８で「ＮＯ」の場合）、制御部１１は、定数ＥｒｒｏｒＮｕｍ＿５を引数としてエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（この場合、ｆｕｎｃＥｒｒｏｒ（ＥｒｒｏｒＮｕｍ＿５））を実行する（ステップＳ３９）。このステップＳ３８の処理が図１に示す複数の分岐部３１のうちの１つに対応する。また、定数ＥｒｒｏｒＮｕｍ＿５が、ステップＳ３８の処理に対応する分岐部３１に設定されたユニーク番号３２である。
【００３７】
次に、図６を参照して、図４および図５に示すエラー処理関数ｆｕｎｃＥｒｒｏｒ（）（ステップＳ２４、ステップＳ２７、ステップＳ２９、ステップＳ３４、ステップＳ３７、およびステップＳ３９）の構成例について説明する。この場合、エラー処理関数ｆｕｎｃＥｒｒｏｒ（）は、エラー処理Ａ、ユニーク番号書き込み処理、およびエラー処理Ｂを含む。なお、図６において、引数ＥｒｒｏｒＮｕｍ＿ｉは、Ｎ個の定数ＥｒｒｏｒＮｕｍ＿０、ＥｒｒｏｒＮｕｍ＿１、ＥｒｒｏｒＮｕｍ＿２、…、ＥｒｒｏｒＮｕｍ＿Ｎ−１のいずれかの値をとる変数である（ｉ＝０、１、２、…、Ｎ−１）。ここでＮはエラー処理関数ｆｕｎｃＥｒｒｏｒ（）を呼び出す箇所（および分岐部３１）の個数である。図６に示す例では、制御部１１は、エラー処理Ａ（ステップＳ４１）とユニーク番号書き込み処理（ステップＳ４２）とエラー処理Ｂ（ステップＳ４３）をこの順に実行する。
【００３８】
ユニーク番号書き込み処理（ステップＳ４２）は、制御部１１がユニーク番号３２を表す変数ＥｒｒｏｒＮｕｍ＿ｉを図１に示すユニーク番号記憶領域１３３１に記憶する処理である。なお、ユニーク番号記憶領域１３３１のアドレスは、例えば図２に示すように定数Ａｄｄｒｅｓｓ＿０＝０ｘ１２３４（１６進数）というようにソースプログラム内で定義される。
【００３９】
また、エラー処理Ａ（ステップＳ４１）は、ユニーク番号書き込み処理（ステップＳ４２）より前に実行されるエラー発生時の処理を含み、カードＨＡＬＴ処理とカードロックの処理は含まない。
【００４０】
また、エラー処理Ｂ（ステップＳ４２）は、ユニーク番号書き込み処理（ステップＳ４２）より後に実行されるエラー発生時の処理を含み、カードＨＡＬＴ処理とカードロックの処理を含むことができる。エラー処理Ｂ（ステップＳ４２）において、カードＨＡＬＴ処理（図１２）とカードロックの処理（図１１）のどちらを実行するのか、あるいはどちらも実行せずにステップＳ１４（図３）でエラーステータスを送信するのかという判断は、例えば次のように行うことができる。すなわち、例えば、制御部１１は、エラー処理関数ｆｕｎｃＥｒｒｏｒ（）を実行する前に記憶部１３内の所定の記憶領域にエラー処理の内容を表すデータを記憶し、エラー処理Ｂ（ステップＳ４２）内でそのデータを参照して判断することができる。あるいは、例えば、エラー処理関数ｆｕｎｃＥｒｒｏｒ（）にエラー処理の内容を表す引数を追加で定義しておき、エラー処理Ｂ（ステップＳ４２）内で制御部１１がその引数の値に基づいて判断することができる。あるいは、例えば、ユニーク番号３２を表す定数ＥｒｒｏｒＮｕｍ＿０〜ＥｒｒｏｒＮｕｍ＿Ｎにエラー処理の内容を表す意味を定義しておき（例えば数字の範囲毎に内容を定義しておき）、エラー処理Ｂ（ステップＳ４２）内で制御部１１が引数ＥｒｒｏｒＮｕｍ＿ｉの値に基づいて判断することができる。
【００４１】
エラー処理Ｂ（ステップＳ４２）においてカードＨＡＬＴ処理が実行された場合、図１２を参照して説明したように半導体装置１（ＩＣカード）はカード無応答に遷移するので、制御部１１は遷移したときに図３に示すｓｅｌｅｃｔコマンド処理（ステップＳ１３）を停止する。エラー処理Ｂ（ステップＳ４２）においてカードロック処理が実行された場合、図１１を参照して説明したように半導体装置１（ＩＣカード）はカードをロックした後、カード無応答に遷移するので、制御部１１は遷移したときに図３に示すｓｅｌｅｃｔコマンド処理（ステップＳ１３）を停止する。なお、カード無応答に遷移した場合、電源を一旦落とした後に再投入することで半導体装置１（ＩＣカード）を通常動作させることができ、ロックされた場合には所定のロック解除コマンドが入力された後、半導体装置１（ＩＣカード）を通常動作させることができる。
【００４２】
また、図６に示すように、ユニーク番号書き込み処理（ステップＳ４２）は、例えば、関数ｆｕｎｃＷｒｉｔｅ（）として構成されていて、書き込み処理Ａ（ステップＳ５１）と、引数ＥｒｒｏｒＮｕｍ＿ｉの値をアドレスＡｄｄｒｅｓｓ＿０に書き込む処理（ステップＳ５２）と、書き込み処理Ｂ（ステップＳ５３）を含む。ここで、関数ｆｕｎｃＷｒｉｔｅ（）は、指定したアドレスに指定した値を書き込む関数である。ステップＳ４２において制御部１１は、アドレスの値を示す関数ｆｕｎｃＷｒｉｔｅ（）の引数にＡｄｄｒｅｓｓ＿０を、書き込む値を示す関数ｆｕｎｃＷｒｉｔｅ（）の引数にＥｒｒｏｒＮｕｍ＿ｉを設定して、関数ｆｕｎｃＷｒｉｔｅ（）（ｆｕｎｃＷｒｉｔｅ（Ａｄｄｒｅｓｓ＿０、ＥｒｒｏｒＮｕｍ＿ｉ））を実行する。書き込み処理Ａ（ステップＳ５１）は、例えば、引数ＥｒｒｏｒＮｕｍ＿ｉの値をアドレスＡｄｄｒｅｓｓ＿０に書き込む処理（ステップＳ５２）の準備のための処理を含む。ステップＳ５２では、制御部１１が、アドレスＡｄｄｒｅｓｓ＿０のユニーク番号記憶領域１３３１に、引数ＥｒｒｏｒＮｕｍ＿ｉの値を記憶する。書き込み処理Ｂ（ステップＳ５３）は、例えば、引数ＥｒｒｏｒＮｕｍ＿ｉの値をアドレスＡｄｄｒｅｓｓ＿０に書き込む処理（ステップＳ５２）後に必要な処理を含む。
【００４３】
以上のように、制御部１１１は、複数の分岐部３１（ステップＳ２２、ステップＳ２５、ステップＳ２８、ステップＳ３２、ステップＳ３５、およびステップＳ３８）がプログラムの進行をエラー処理に分岐させた場合（エラー処理関数ｆｕｎｃＥｒｒｏｒ（）を実行する処理を行わせた場合）に、ユニーク番号３２（Ｎ個の定数ＥｒｒｏｒＮｕｍ＿０、ＥｒｒｏｒＮｕｍ＿１、ＥｒｒｏｒＮｕｍ＿２、…、ＥｒｒｏｒＮｕｍ＿Ｎ−１のいずれかの値）を引数ＥｒｒｏｒＮｕｍ＿ｉに設定してエラー処理関数ｆｕｎｃＥｒｒｏｒ（）を実行することで、当該分岐部３１に設定されたユニーク番号３２（Ｎ個の定数ＥｒｒｏｒＮｕｍ＿０、ＥｒｒｏｒＮｕｍ＿１、ＥｒｒｏｒＮｕｍ＿２、…、ＥｒｒｏｒＮｕｍ＿Ｎ−１のいずれかの値）を記憶部１３のアドレスＡｄｄｒｅｓｓ＿０の領域（ユニーク番号記憶領域１３３１）に書き込む。
【００４４】
次に、図７〜図９を参照して、図１に示すシステム１０において端末２（リーダライタ）がユニーク番号３２を半導体装置１（ＩＣカード）から読み取る際の動作例について説明する。図７は、図１に示すシステム１０において特殊コマンドでユニーク番号３２を確認する動作例を示すフローチャートである。本実施形態において特殊コマンドは、ユニーク番号記憶領域１３３１からのユニーク番号３２の読み出しを指示する専用のコマンドである。図８は、図７に示す認証コマンド処理（ステップＳ６３）の構成例を示すフローチャートである。図９は、図７に示す特殊コマンド処理（ステップＳ６８）の構成例を示すフローチャートである。
【００４５】
図７に示す例では、端末２（リーダライタ）が、特殊コマンドの送信に先立って、まず、認証コマンドを送信する（ステップＳ６１）。半導体装置１（ＩＣカード）は、認証コマンドを受信すると（ステップＳ６２）、受信した認証コマンドに応じて認証コマンド処理を実行する（ステップＳ６３）。次に、半導体装置１（ＩＣカード）は、ステップＳ６３の認証コマンド処理の結果に基づき応答を送信し（ステップＳ６４）、端末２（リーダライタ）が応答を受信する（ステップＳ６５）。ステップＳ６５で、半導体装置１（ＩＣカード）は、送信する応答にステータスワード（ＳＷ）を含めて送信する。
【００４６】
ステップＳ６３において制御部１１は、ステップＳ６２で受信した認証コマンドに含まれるＰＩＮ（Ｐｅｒｓｏｎａｌ  Ｉｄｅｎｔｉｆｉｃａｔｉｏｎ  Ｎｕｍｂｅｒ（個人識別番号））を表す引数を設定して図８に示す認証処理関数ｆｕｎｃ＿Ｖｅｆｉｆｙ（）を実行する。
【００４７】
図８に示すように、認証処理関数ｆｕｎｃ＿Ｖｅｆｉｆｙ（）において、制御部１１は、まず、ＰＩＮ照合処理を実行する（ステップＳ８１）。ＰＩＮ照合処理において、制御部１１は、端末２（リーダライタ）から受信したＰＩＮを、記憶部１３に予め記憶されているＰＩＮと照合する。次に、制御部１１は、照合が一致したか否かを判断し（ステップＳ８２）、一致した場合（ステップＳ８２で「ＹＥＳ」の場合）には認証処理関数ｆｕｎｃ＿Ｖｅｆｉｆｙ（）を正常終了し、一致しなかった場合（ステップＳ８２で「ＮＯ」の場合）には認証エラー処理を実行する。認証エラー処理は、例えば、カードＨＡＬＴ処理、カードロックの処理等である。
【００４８】
端末２（リーダライタ）は、ステップＳ６５で認証処理が正常終了したことを示す応答を受信すると、特殊コマンドを送信する（ステップＳ６６）。半導体装置１（ＩＣカード）は、特殊コマンドを受信すると（ステップＳ６７）、受信した特殊コマンドに応じて特殊コマンド処理を実行する（ステップＳ６８）。次に、半導体装置１（ＩＣカード）は、ステップＳ６８の特殊コマンド処理の結果に基づき応答を送信し（ステップＳ６９）、端末２（リーダライタ）が応答を受信する（ステップＳ７０）。ステップＳ６９において、半導体装置１（ＩＣカード）は、送信する応答に、ユニーク番号記憶領域１３３１に記憶されているユニーク番号３２（エラー処理関数を実行（コール）させた分岐部３１に設定されたユニーク番号３２）を含ませる。
【００４９】
なお、ステップＳ６８において制御部１１は、ステップＳ６７で受信した特殊コマンドに応じて図９に示す特殊読み出し関数ｆｕｎｃＲｅａｄ＿ｓｐｅｃｉａｌ（）を実行する。
【００５０】
図９に示すように、関数ｆｕｎｃＲｅａｄ＿ｓｐｅｃｉａｌ（）において、制御部１１は、特殊処理Ａ（ステップＳ９１）と、記憶部１３のＡｄｄｒｅｓｓ＿０の値（ユニーク番号記憶領域１３３１に記憶されている値）を取得する処理（ステップＳ９２）と、特殊処理Ｂ（ステップＳ９３）を実行する。特殊処理Ａ（ステップＳ９１）は、例えば、記憶部１３のＡｄｄｒｅｓｓ＿０の値を取得する処理（ステップＳ９２）の準備のための処理を含む。ステップＳ９２で、制御部１１は、アドレスＡｄｄｒｅｓｓ＿０のユニーク番号記憶領域１３３１に記憶されている値を取得する（例えば所定のＣＰＵレジスタ等に読み込む）。特殊処理Ｂ（ステップＳ９３）は、例えば、アドレスＡｄｄｒｅｓｓ＿０のユニーク番号記憶領域１３３１に記憶されている値を取得後に必要な処理を含む。
【００５１】
以上のように、制御部１１は、ユニーク番号記憶領域１３３１からのユニーク番号３２の読み出しを指示する専用のコマンドである特殊コマンドに応じて、ユニーク番号記憶領域１３３１からユニーク番号３２を読み出して出力する。本実施形態では、特殊コマンドを用いることで、読み出しアドレスを指定せずにユニーク番号記憶領域１３３１から（本実施形態ではアドレスＡｄｄｒｅｓｓ＿０）からユニーク番号３２を読み出すことができる。また、制御部１１は、所定の認証処理によって正当性が確認された場合にユニーク番号記憶領域１３３１からユニーク番号３２を読み出して出力する。すなわち、図７に示す動作例では、制御部１１が、特殊コマンド処理（ステップＳ６８）を実行する前に認証コマンド処理（ステップＳ６３）を実行しているが、認証コマンド処理（ステップＳ６３）は省略してもよい。
【００５２】
なお、ユニーク番号記憶領域１３３１がＥＥＰＲＯＭ１３３内に確保されている場合、図６に示すユニーク番号書き込み処理（ステップＳ４２）と図７に示す特殊コマンド処理（ステップＳ６８）は連続的に実行しなくてもよいが、ユニーク番号記憶領域１３３１がＲＡＭ１３２内に確保されている場合、図６に示すユニーク番号書き込み処理（ステップＳ４２）と図７に示す特殊コマンド処理（ステップＳ６８）は連続的に（書き込みから読み出しまでの間に電源が落ちない状態で）実行する必要がある。
【００５３】
また、ユニーク番号記憶領域１３３１からのユニーク番号３２の取り出しは、例えば汎用のＲＥＡＤ  ＢＩＮＡＲＹコマンドを用いて行えるようにしてもよい。また、上述した特殊コマンドによる読み出しに限定してもよい。また、ユニーク番号３２を読み出せる特殊コマンドの使用方法は例えばカードベンダやカード発行者等のカードを解析する権限を持つ者だけに開示してもよい。この場合、エラー情報を取得できるのが解析者しかできないため、悪意攻撃防止もできると考えられる。
【００５４】
以上のように上述した実施形態では、半導体装置１が、エラーステータスの応答、カードロックや無応答（ＨＡＬＴ）等のエラー処理の際に、エラー処理を実施するモジュール（関数）をコールする箇所すべてにユニークな値であるユニーク番号３２を記憶する機能を持つ。ユニーク番号３２は、半導体装置１が実行するプログラムを例えば高級言語で作成した場合にソースプログラム内で容易に定義することができる。したがって、半導体装置１の解析の際にはこのユニーク番号３２を読み出すことで、例えば高級言語で記述されたソースプログラムのどこでエラーが発生したのか（または攻撃を検知したのか）を特定することが容易となる（直接的に特定することができる）。したがって、解析者の仕事の効率化に貢献することができる。
【００５５】
以上、この発明の実施形態について図面を参照して説明してきたが、具体的な構成は上記実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計変更等も含まれる。なお、半導体装置１および端末２で実行される上記実施形態に係るプログラムの一部または全部は、コンピュータ読取可能な記録媒体、通信回線等を介して頒布することができる。
【符号の説明】
【００５６】
１  半導体装置
２  端末
１０  システム
１１  制御部
１３  記憶部
３１  分岐部
３２  ユニーク番号
１３３１  ユニーク番号記憶領域
【図１】
2020119328.tif 000003
【図２】
2020119328.tif 000004
【図３】
2020119328.tif 000005
【図４】
2020119328.tif 000006
【図５】
2020119328.tif 000007
【図６】
2020119328.tif 000008
【図７】
2020119328.tif 000009
【図８】
2020119328.tif 000010
【図９】
2020119328.tif 000011
【図１０】
2020119328.tif 000012
【図１１】
2020119328.tif 000013
【図１２】
2020119328.tif 000014