ICカード及びプログラムコードの診断方法
【課題】 プログラムコードの自己診断によって特定のコマンド処理に不具合が発生すること、あるいはプログラムコード自己診断の実行が不十分となることを回避することのできるICカード及びプログラムコードの診断方法を提供する。
【解決手段】 外部からのコマンドを解釈実行し、その結果を応答するICカード(1)において、ICカードで実行されるプログラムを格納するプログラム領域(104)と、外部からコマンドを受信する受信部(13)と、コマンドに対応した処理、及びプログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部(101)とを有し、制御部は、プログラムコードの良否診断を、受信部が所定のコマンドを受信する毎の複数回に分割して実行し、分割された良否診断を実行した後で当該所定のコマンドの処理を実行するICカードである。
【解決手段】 外部からのコマンドを解釈実行し、その結果を応答するICカード(1)において、ICカードで実行されるプログラムを格納するプログラム領域(104)と、外部からコマンドを受信する受信部(13)と、コマンドに対応した処理、及びプログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部(101)とを有し、制御部は、プログラムコードの良否診断を、受信部が所定のコマンドを受信する毎の複数回に分割して実行し、分割された良否診断を実行した後で当該所定のコマンドの処理を実行するICカードである。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、プログラムコード自己診断機能を持つICカード及びプログラムコードの診断方法に関する。
【背景技術】
【0002】
一般に、ICカードには、プラスチックなどで形成されたカード状の本体内に制御素子(CPU)および各種メモリなどを有するICチップが埋め込まれている。このようなICカードには、各種メモリに格納されているデータを自己診断する機能を有するものがある。
【0003】
ICカードの自己診断機能として、LSIがサポートする各種ハードウェアの診断、オペレーティングシステム(OS)やアプリケーションプログラムを含むプログラムコードの自己診断、OSやアプリケーションプログラムの動作に必要なデータを格納するデータ領域の自己診断、RAMの自己診断などが提案されている。
【0004】
上記各自己診断の中でもプログラムコードの自己診断では、対象とするプログラムコードのサイズが大きいと、それに対応して自己診断の実行時間も大きくなる。そのため、将来、ICカードの持つ機能が多様化、複雑化するに伴って、プログラムコードのサイズが大きくなると、プラグラムコードの自己診断時間も長くなると想定される。
【0005】
そのため、この処理時間の長いプログラムコードの自己診断を、いつ実行するのか、という点が重要となっている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2008−310597号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
上記したように、プログラムコードの自己診断を一括して実行する場合、いつ実行するのかが重要となる。ICカードは、外部装置からのコマンド(命令)に応じて受動的に動作し、また、ISO/IEC7816等で規定されるように、コマンドに対するレスポンスデータを応答した後は、低消費電流モードに移行することが要求される場合がある。
【0008】
このため、一般的にICカードの自己診断は、コマンド受信終了後から、レスポンスデータ応答前までの間、つまりコマンド処理の一環として実行される。
また、プログラムコードの自己診断は、ICカードを活性化した後に1度、たとえば最初に受信したコマンドなど、1つのコマンド処理中に実行される、あるいは、特定の処理を実行する前に、その対象となる領域の自己診断が実行されるという方法が提案されている。
【0009】
ここで、1つのコマンド処理中に実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、プログラムコードのサイズが大きい場合、最初に受信したコマンドに対するICカードの処理時間が長くなる。そのため、外部装置側にICカードの処理が不当に長くなっているという判定を行なうための処理タイムアウト時間が設定されていて、自己診断を行なうことによりこのタイムアウト時間を超えてしまった場合、ICカードと外部装置との間の処理が正しく行なえなくなる。
【0010】
また、ICカードの活性化後に1回実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、ICカードが携帯電話機に挿入されて使用されるUIMカードなどである場合、携帯電話機の電源は、通常は、オン状態を継続するため、ICカードは常に活性化された状態を保持する。そのため、次の自己診断処理は、所有者が一旦、携帯電話機の電源をオフし、再度、携帯電話機の電源をオンした場合にのみ実行されるため自己診断がほとんど行なわれなくなる。
【0011】
従って、プログラムコードの自己診断によって特定のコマンド処理に不具合が発生することを回避し、あるいはプログラムコード自己診断の実行が不十分となることを回避することのできるICカード及びプログラムコードの診断方法を提供することを目的とする。
【課題を解決するための手段】
【0012】
上記課題を解決するための本発明の実施の形態によれば、外部からのコマンドを解釈実行し、その結果を応答するICカードにおいて、前記ICカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、前記制御部は、前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行するICカードが提供される。
【図面の簡単な説明】
【0013】
【図1】第1の実施の形態に係るICカードの構成を概略的に示す図。
【図2】第1の実施の形態のデータメモリ、RAMおよびROMの構成を模式的に示す図。
【図3】第1の実施の形態のRAMの領域に一時記憶される各種データの具体例を示す図。
【図4】第1の実施の形態に係る自己診断処理手順を示すフローチャート。
【図5】第1の実施の形態に係る自己診断処理手順を示すフローチャート。
【図6】第1の実施の形態のバリエーション1に係る自己診断処理手順の一部を示すフローチャート。
【図7】、第1の実施の形態のバリエーション2に係る自己診断処理手順の一部を示すフローチャート。
【図8】第1の実施の形態のバリエーション2に係るリーダライタ用コマンドの概略のフォーマットを示す図。
【図9】第1の実施の形態のバリエーション3に係る自己診断処理手順の一部を示すフローチャート。
【図10】第1の実施の形態のバリエーション4に係る自己診断処理手順の一部を示すフローチャート。
【図11】第2の実施の形態の自己診断処理手順の一部を示すフローチャート。
【発明を実施するための形態】
【0014】
〔第1の実施の形態〕
図1は、第1の実施の形態に係るICカードの構成を概略的に示す図である。このICカード1は、非接触通信機能及び接触式通信機能をサポートする複合ICカードである。ICカード本体1a内にはICモジュール11が埋設されている。ICモジュール11は、ICチップ12、非接触通信手段としての非接触通信部13aおよび接触式通信手段としての接触端子13bを有し、これらは一体的にモジュール化されている。
ICカード1は、非接触通信部13aを介して非接触通信方式により非接触式カードリーダ・ライタ(外部装置)2aと通信を行なう。ICカード1は、接触端子13bを介して接触通信方式により接触式カードリーダ・ライタ(外部装置)2bと通信を行なう。
【0015】
ICチップ12は、CPU(セントラル・プロセッシング・ユニット)101、データメモリ102、RAM(ランダム・アクセス・メモリ)103、ROM(リード・オンリ・メモリ)104、非接触通信インターフェース(I/F)105a、および接触通信インターフェース(I/F)105b、105cを有して構成される。
【0016】
CPU101は、制御部として機能する。データメモリ102は、各種データを保持(記憶)するための記憶手段である。RAM103は、ワーキングメモリとして機能する記憶手段である。ROM104は、CPU101が実行するプログラムなどを格納した記憶手段である。非接触通信インターフェース(I/F)105aは、非接触通信部13aを介して非接触式カードリーダ・ライタ2aと授受される通信情報を仲介する。接触通信インターフェース(I/F)105b、105cは、接触端子13bを介して接触式カードリーダ・ライタ2bと授受される通信情報を仲介する。
【0017】
データメモリ102は、たとえば、EEPROMやフラッシュメモリなどの不揮発性メモリにより構成されていて、本実施形態では、256Kバイトの容量を有している。
【0018】
図2は、第1の実施の形態のデータメモリ102、RAM103およびROM104の構成を模式的に示す図である。
【0019】
ROM104には、プログラムコードおよびプログラムコードが破壊されていないことを確認するためのチェックコード期待値が格納されている。なお、チェックコード期待値は、プログラムコードの一部としてプログラムコード内にあらかじめ格納されている。
ROM104は、本実施形態では、たとえば、開始アドレスが[0x000000]、終了アドレスが[0x03FFFF]で、256Kバイトの容量を有している。
【0020】
RAM103には、領域103a〜103eが確保されている。
領域103aには、プログラムコード自己診断の結果情報である自己診断結果フラグが一時記憶される。領域103bには、自己診断が終了したアドレスが一時記憶される。領域103cには、中間結果あるいはチェックコード期待値と比較する最終結果となるチェックコード算出値が一時記憶される。領域103dには、所定のイニシャル状態から受信したコマンドの累積数が一時記憶される。領域103eには、一回の自己診断でチェックされるROM104のサイズが一時記憶される。
なお、RAM103は、本実施形態では、たとえば、40Kバイトの容量を有している。
【0021】
図3は、第1の実施の形態のRAM103の領域103a〜103eに一時記憶される各種データの具体例を示す図である。
【0022】
領域103aに一時記憶される自己診断結果フラグは、たとえば、1バイトのデータで、プログラムコード自己診断状況(未実施、実施中、終了)、および自己診断が終了している場合はその結果(正常、異常)を示す情報である。
【0023】
領域103bに一時記憶される自己診断終了アドレスは、たとえば、3バイトのデータで、前回コマンド処理終了時点で、プログラムコードのどの部分までの自己診断が終了したか(未実施、実施中、終了)、を一時記憶するための情報である。具体的には、その時点で自己診断が終了した最終のメモリアドレスを情報として記憶する。
【0024】
領域103cに一時記憶されるチェックコード算出値は、たとえば、2バイトのデータで、自己診断終了アドレスが、終了(つまり、プログラムコードの最終アドレス)を示していない場合は中間結果を表し、終了を示している場合は自己診断最終チェックコード値を表している。自己診断最終チェックコード値は、自己診断の合否判定を行なうためにプログラムコード内にあらかじめ格納されたチェックコード期待値と比較するためのデータである。
【0025】
領域103dに一時記憶されるコマンドカウンタは、例えば、2バイトのデータで、電源がオンされて活性化された初期状態、あるいは所定のイニシャル状態からのICカード2が受信したコマンドの累積数を示す情報である。
【0026】
領域103eに一時記憶される分割サイズは、自己診断を実施する際に、一回の自己診断でチェックされるROM104のサイズを示す情報である。
【0027】
図4、図5は、第1の実施の形態に係る自己診断処理手順を示すフローチャートである。なお、本フローチャートでは、ICカード1の全ての処理を詳細には記載せず、本実施形態の説明を行なう上で必要となる部分のみについて記載している。また、本フローチャートでは、説明を簡略化するために、特に断らない限り接触式カードリーダ・ライタ2bとの送受信について記載する。特に断らない限り非接触式カードリーダ・ライタ2aとの送受信も同様に行なわれる。
【0028】
ISO/IEC7816シリーズに規定された手順にしたがって活性化されることで、CPU101は、自己診断処理を開始する(ステップS1)。ステップS2において、CPU101は、RAM103の初期化を実行する。初期化によって、RAM103の領域103a〜103eに示した各一時記憶データに初期値が書き込まれる。
【0029】
ステップS3において、CPU101は、ISO/IEC7816シリーズの規定にしたがい、ATR(アンサー・ツー・リセット)を外部装置である接触式カードリーダ・ライタ2bへ送信する。ステップS4において、ATR送信後、CPU101は、接触式カードリーダ・ライタ2bからのコマンドを待つための受信待ちモードへ進む。接触式カードリーダ・ライタ2bからコマンドが送信されない場合、本ステップS4に留まり続ける。
【0030】
接触式カードリーダ・ライタ2bからコマンドを受信すると、ステップS5において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常または正常)」または「終了でない」のいずれかを判定する。
【0031】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」を示していた場合、何らかの原因によりプログラムコードが誤ったコードに書き換えられていることを示している。従ってこの場合は、このプログラムコードを実行することは中止すべきである。ステップS20において、CPU101は、コマンドの処理を実行せず、自己診断エラーを意味するステータスワード(SW)を接触式カードリーダ・ライタ2bへ応答する。そして、再びステップS4のコマンド受信待ち状態へ戻る。
【0032】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」でも「終了(正常)」でもない場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【0033】
ステップS6の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、CPU101は、ステップS7において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」に初期値を設定する。そして、ステップS10において、プログラムコード自己診断処理を実行する。
【0034】
ステップS6の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、CPU101は、今回の処理で自己診断を継続して再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。
【0035】
すなわち、ステップS8において、CPU101は、RAM103の領域103cに記憶されている中間結果のチェックコード算出値をセットする。ステップS9において、CPU101は、RAM103の領域103bに記憶されている自己診断終了アドレスに「+1」した値を自己診断開始アドレスにセットする。そして、ステップS10において、プログラムコード自己診断処理を実行する。
【0036】
ステップS10において、CPU101は、ROM104内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。
【0037】
ステップS10におけるプログラムコード自己診断の方法として、第1の実施の形態では、たとえば、CRC16演算を利用する。CRC16演算では、プログラムコードを途中までチェックした場合、それまでのチェック結果を保存しておき、プログラムコードのチェックを再開した場合は、保存したチェック結果を初期値として使用することでチェックを継続して実行することが可能である。
【0038】
ステップS10において、CPU101は、「開始アドレス」から自己診断を実行し、RAM103の領域103eに記憶された「分割サイズ」で指定されたサイズ分のプログラムコード自己診断処理を実行後、終了する。たとえば、1回の自己診断で実施するプログラムコード自己診断対象のデータサイズを64Kバイトとした場合、全プログラムコード領域に対する自己診断は、4回、つまり診断開始後、4コマンド目の処理時点で終了する。
【0039】
ステップS11において、CPU101は、プログラムコードの最終アドレスまで自己診断が終了したかをチェックする。このチェックの結果、ROM104の最終アドレスまで自己診断が終了している場合、ステップS12において、CPU101は、算出されたチェックコードと、あらかじめROM104のプログラムコードに格納されたチェックコード期待値とを比較する。
【0040】
ステップS12の比較の結果、両者の値が一致(自己診断成功)した場合(ステップS13 Yes)、ステップS14において、CPU101は、全てのプログラムコードが正しい値を保持している、即ちプログラムコードが壊れたり、改竄されたりしていない、と判断する。そしてCPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「終了(正常)」に設定し、ステップS15へ進む。
【0041】
ステップS12の比較の結果、両者の値が不一致の場合(ステップS13 No)、ステップS16において、CPU101は、プログラムコード自体に何らかの問題があると判断する。そしてCPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「終了(異常)」に設定し、ステップS20へ進む。
【0042】
ステップS11のチェックの結果、プログラムコードの最終アドレスまで自己診断が終了していない場合、ステップS17において、CPU101は、中間状態を保存するために、自己診断が終了した時点のアドレス(自己診断終了アドレス)、および、自己診断が終了した時点のチェックコード算出値をRAM103の領域103b,103cに保存する。
【0043】
ステップS18において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「実施中」に設定し、ステップS15へ進む。
【0044】
ステップS5の判定の結果、自己診断結果フラグが「終了(正常)」を示していた場合、CPU101は、ステップS6〜S14,S16〜S18を実施せずにステップS15へ進む。
【0045】
ステップS15において、CPU101は、接触式カードリーダ・ライタ2bから受信したコマンドの処理を開始する。ステップS19において、CPU101は、コマンド処理実行後、その処理結果に応じたステータスワード(SW)を接触式カードリーダ・ライタ2bへ応答し、再びステップS4のコマンド受信待ち状態へ戻る。
【0046】
以上説明したように上記第1の実施形態に係る動作によれば、ICカード1の活性化後、接触式カードリーダ・ライタ2bから最初のコマンドを受信した場合に、プログラムコードのチェックコード算出を、ROM104に格納されたプログラムコードの先頭アドレスから開始し、あらかじめRAM103に設定されたサイズまでのチェックコードを算出する。その時点で全プログラムコードのチェックコード算出が終了していない場合は、算出した中間のチェックコード、および、チェックコードの算出が終了した領域の最終チェック済アドレス情報をRAM103に一時保存する。その後に、コマンドの処理を実行しその結果を接触式カードリーダ・ライタ2bへ応答する。
【0047】
さらに後続のコマンドを受信した場合に、前回一時保存した最終チェック済アドレスおよび中間チェックコードを用いて、チェックコード算出が終了していないプログラムコードの先頭アドレスから同様にチェックコード算出を継続する。
【0048】
最終的に全てのプログラムコードについてチェックコード算出処理が終了した後で、あらかじめプログラムコード内に書込まれたチェックコード期待値と算出したチェックコードとを比較し、両者の値が一致した場合は、自己診断終了と判断して通常のコマンド処理結果を接触式カードリーダ・ライタ2bへ応答し、不一致の場合は、コマンド処理結果を破棄して、自己診断異常を意味するエラーコードを接触式カードリーダ・ライタ2bへ応答する。
【0049】
このように、プログラムコードの自己診断を1つのコマンド処理内で全て実行するのではなく、複数のコマンド処理毎に分割して実行する。
【0050】
〔第1の実施の形態のバリエーション1〕
第1の実施の形態のバリエーションでは、図1に示すように、ICカード1が複数の通信手段(通信インターフェース)を持つ場合の処理について説明する。
【0051】
図6は、第1の実施の形態のバリエーション1に係る自己診断処理手順の一部を示すフローチャートである。図6に示す処理は、図4のステップS5の処理に対応する。
【0052】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0053】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
【0054】
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS52において、受信したコマンドが所定の通信インターフェースを介して取得されたかどうかを調べる。通信インターフェースには、上述のように「非接触通信インターフェース」、「接触通信インターフェース」などがあり、それぞれ通信する情報の種類が異なる。また、「接触通信インターフェース」であっても、「USB」、「SWP」などがあり同様に通信する情報の種類が異なる。従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とが通信インターフェースによって識別できる場合は、対象通信インターフェースから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。そして、コマンド処理に長時間を要しても良い処理である場合には、自己診断処理を実行する。
【0055】
従って、対象通信インターフェースからのコマンドでない場合(ステップS52 No)は、自己診断処理を実行せず、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0056】
対象通信インターフェースからのコマンドである場合(ステップS52 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0057】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0058】
上述のようにバリエーション1に係る形態では、特定の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0059】
〔第1の実施の形態のバリエーション2〕
図7は、第1の実施の形態のバリエーション2に係る自己診断処理手順の一部を示すフローチャートである。図7に示す処理は、図4のステップS5の処理に対応する。
【0060】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0061】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS54において、受信したコマンドが対象チャンネルからのものかどうかを調べる。
【0062】
図8は、第1の実施の形態のバリエーション2に係るリーダライタ用コマンドの概略のフォーマットを示す図である。
【0063】
図8は、リーダライタ用コマンドにおけるコマンドブロック内のDAT部のフォーマットである。このフォーマットの項目「CLA」(コマンドの層別)には、チャンネルの指定が0〜3の値で記載されている。例えば、チャネル指定が0のときは、チャネル0:携帯電話の3Gアプリを指定し、チャネル指定が1のときは、チャネル1:クレジットアプリを指定する。
【0064】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがチャネルによって識別できる場合は、対象チャネルから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。
【0065】
従って、対象チャネルから取得したコマンドでない場合(ステップS54 No)は、自己診断処理を実行せず、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0066】
対象チャネルから取得したコマンドである場合(ステップS54 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0067】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0068】
上述のようにバリエーション2に係る形態では、当該ICカードが、ISO/IEC7816−4に規定される論理チャネルを少なくとも2つ以上持つ場合において、特定の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0069】
〔第1の実施の形態のバリエーション3〕
図9は、第1の実施の形態のバリエーション3に係る自己診断処理手順の一部を示すフローチャートである。図9に示す処理は、図4のステップS5の処理に対応する。
【0070】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0071】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS54において、受信したコマンドが対象とするコマンドかどうかを調べる。
【0072】
対象とするコマンドとは、コマンド処理に長時間を要するものである。例えば、ファイルのアクセスが含まれている処理が該当する。このようなコマンド処理を行なう場合は、それに併せて自己診断処理を実行した場合であっても、コマンド処理においてタイムアウトなどの不具合を発生させることを回避することができる。
【0073】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがコマンド名によって識別できる場合は、取得したコマンド名から、コマンド処理に長時間を要しても良い処理であると判断することができる。
【0074】
従って、取得したコマンドが対象コマンドでない場合(ステップS55 No)は、自己診断処理を実行せずに、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0075】
取得したコマンドが対象コマンドである場合(ステップS55 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0076】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0077】
上述のようにバリエーション3に係る形態では、当該ICカードが、特定のコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、その他のコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0078】
〔第1の実施の形態のバリエーション4〕
図10は、第1の実施の形態のバリエーション4に係る自己診断処理手順の一部を示すフローチャートである。図10に示す処理は、図4のステップS6〜S10の処理に対応する。バリエーション4に係る形態では、自己診断の分割数を指定したコマンドを外部装置から受信する。
【0079】
ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【0080】
ステップS6の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、CPU101は、ステップS7において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」を設定する。なお、「開始アドレス」、「チェックコード算出値」は初期値である。そして、ステップS56の処理を実行する。
【0081】
ステップS6の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、CPU101は、今回の処理で自己診断を再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。
【0082】
すなわち、ステップS8において、CPU101は、RAM103の領域103cに記憶されている中間結果のチェックコード算出値をセットする。ステップS9において、CPU101は、RAM103の領域103bに記憶されている自己診断終了アドレスに「+1」した値を自己診断開始アドレスにセットする。そして、ステップS56の処理を実行する。
【0083】
ステップS56において、CPU101は、取得したコマンドが、自己診断をいくつの回数Nに分割して実行するか、を指定する専用のコマンドかどうかを調べる。
専用のコマンドでない場合は、ステップS10の自己診断処理を実行する。
専用のコマンドである場合は、ステップS57において、CPU101は、分割した1回当たりにチェックするプログラムコードのサイズを求め、領域103eの「分割サイズ」にセットする。1回当たりにチェックするプログラムコードのサイズSは、プログラムコードの全サイズT、分割数Nを用いて次の式(1)で表される。
【0084】
S=[T/N]+1 ・・・式(1)
ここで、演算[ ]は、演算結果の小数点以下を切り捨てて整数値とするガウスの記号である。なお、演算結果が割り切れて整数値となる場合は、次の式(2)で表される。
【0085】
S=[T/N] ・・・式(2)
ステップS10において、CPU101は、ROM104内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。また、領域103eの「分割サイズ」で表されるサイズだけのコードをチェックする。
【0086】
なお、ステップS57において、コマンド処理を行なったため、図5のステップS15に示すコマンド処理は実行しない。
【0087】
上述のようにバリエーション4に係る形態では、分割数を指定した専用のコマンドを受信した場合に、プログラム領域のサイズおよび指定された分割数から、1つのコマンドを受信した際に行うべきチェックコード算出サイズを決定する。従って、適切な分割数で自己診断を行なうことができるため、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0088】
〔第2の実施の形態〕
図11は、第2の実施の形態の自己診断処理手順の一部を示すフローチャートである。図11に示す処理では、ステップS35の処理が第1の実施の形態と異なっている。第1の実施の形態と同一の部位には同一の符号を付してその詳細の説明は省略する。
【0089】
ステップS31〜S34の処理は、第1の実施の形態のステップS1〜S4の処理と同じであるためその説明は省略する。
【0090】
ステップ35において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判定する。
【0091】
ステップS35の判定の結果、自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。この後の処理は第1の実施の形態と同一であるため詳細の説明は省略する。
【0092】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」でない場合、ステップS36において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。この後の処理は第1の実施の形態と同一であるため詳細の説明は省略する。
【0093】
この第2の実施の形態によれば、ステップS35では、第1の実施の形態と異なって自己診断結果フラグの状態が「終了(正常)」かどうかを判断していない。従って、自己診断結果フラグの状態が「終了(異常)」でなければ、自己診断が終了した後も、後続するコマンドを受信したときに新たに自己診断を開始する。
【0094】
第1の実施の形態では、コマンドを受信するごとに分割して自己診断を実施することができるため、コマンド処理において不具合が発生することを回避することができ、ICカードの信頼度を維持向上することができる。
【0095】
〔第2の実施の形態のバリエーション〕
第2の実施の形態のバリエーションの形態では、自己診断が終了した後に、所定数のコマンドを受信する毎に自己診断を再度実行する。
【0096】
この動作は次のようにして実現することができる。例えば、自己診断が終了したときは、領域103dのコマンドカウンタの値を0にリセットする。そして、以降コマンドを受信するごとにこのコマンドカウンタの値を+1カウントアップする。そしてコマンドカウンタの値が所定の値C以上であるときに再度分割した自己診断の実行を制御する。この動作を繰り返すことで、コマンドを所定数Cだけ受取るごとに自己診断を実施することができる。なお、上述の第2の実施の形態は、所定の値C=1の場合に相当する。
【0097】
なお、上述の各実施の形態で説明した機能は、ハードウェアを用いて構成するに留まらず、ソフトウェアを用いて各機能を記載したプログラムをコンピュータに読み込ませて実現することもできる。また、各機能は、適宜ソフトウェア、ハードウェアのいずれかを選択して構成するものであっても良い。
【0098】
尚、本発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。
上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【0099】
例えば、第1の実施の形態、第2の実施の形態、及びそれぞれのバリエーションの形態を適宜組み合わせて構成することができる。
【符号の説明】
【0100】
1…ICカード、1a…ICカード本体、2a…非接触式カードリーダ・ライタ、2b…接触式カードリーダ・ライタ、2…ICカード、11…ICモジュール、12…ICチップ、13a…非接触通信部、13b…接触端子、101…CPU、102…データメモリ、103…RAM、103a〜103e…領域、104…ROM、105a…非接触通信インターフェース、105b.105c…接触通信インターフェース。
【技術分野】
【0001】
本発明の実施形態は、プログラムコード自己診断機能を持つICカード及びプログラムコードの診断方法に関する。
【背景技術】
【0002】
一般に、ICカードには、プラスチックなどで形成されたカード状の本体内に制御素子(CPU)および各種メモリなどを有するICチップが埋め込まれている。このようなICカードには、各種メモリに格納されているデータを自己診断する機能を有するものがある。
【0003】
ICカードの自己診断機能として、LSIがサポートする各種ハードウェアの診断、オペレーティングシステム(OS)やアプリケーションプログラムを含むプログラムコードの自己診断、OSやアプリケーションプログラムの動作に必要なデータを格納するデータ領域の自己診断、RAMの自己診断などが提案されている。
【0004】
上記各自己診断の中でもプログラムコードの自己診断では、対象とするプログラムコードのサイズが大きいと、それに対応して自己診断の実行時間も大きくなる。そのため、将来、ICカードの持つ機能が多様化、複雑化するに伴って、プログラムコードのサイズが大きくなると、プラグラムコードの自己診断時間も長くなると想定される。
【0005】
そのため、この処理時間の長いプログラムコードの自己診断を、いつ実行するのか、という点が重要となっている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2008−310597号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
上記したように、プログラムコードの自己診断を一括して実行する場合、いつ実行するのかが重要となる。ICカードは、外部装置からのコマンド(命令)に応じて受動的に動作し、また、ISO/IEC7816等で規定されるように、コマンドに対するレスポンスデータを応答した後は、低消費電流モードに移行することが要求される場合がある。
【0008】
このため、一般的にICカードの自己診断は、コマンド受信終了後から、レスポンスデータ応答前までの間、つまりコマンド処理の一環として実行される。
また、プログラムコードの自己診断は、ICカードを活性化した後に1度、たとえば最初に受信したコマンドなど、1つのコマンド処理中に実行される、あるいは、特定の処理を実行する前に、その対象となる領域の自己診断が実行されるという方法が提案されている。
【0009】
ここで、1つのコマンド処理中に実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、プログラムコードのサイズが大きい場合、最初に受信したコマンドに対するICカードの処理時間が長くなる。そのため、外部装置側にICカードの処理が不当に長くなっているという判定を行なうための処理タイムアウト時間が設定されていて、自己診断を行なうことによりこのタイムアウト時間を超えてしまった場合、ICカードと外部装置との間の処理が正しく行なえなくなる。
【0010】
また、ICカードの活性化後に1回実行される、という方式を使用した場合は、次のような問題が発生する恐れがある。たとえば、ICカードが携帯電話機に挿入されて使用されるUIMカードなどである場合、携帯電話機の電源は、通常は、オン状態を継続するため、ICカードは常に活性化された状態を保持する。そのため、次の自己診断処理は、所有者が一旦、携帯電話機の電源をオフし、再度、携帯電話機の電源をオンした場合にのみ実行されるため自己診断がほとんど行なわれなくなる。
【0011】
従って、プログラムコードの自己診断によって特定のコマンド処理に不具合が発生することを回避し、あるいはプログラムコード自己診断の実行が不十分となることを回避することのできるICカード及びプログラムコードの診断方法を提供することを目的とする。
【課題を解決するための手段】
【0012】
上記課題を解決するための本発明の実施の形態によれば、外部からのコマンドを解釈実行し、その結果を応答するICカードにおいて、前記ICカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、前記制御部は、前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行するICカードが提供される。
【図面の簡単な説明】
【0013】
【図1】第1の実施の形態に係るICカードの構成を概略的に示す図。
【図2】第1の実施の形態のデータメモリ、RAMおよびROMの構成を模式的に示す図。
【図3】第1の実施の形態のRAMの領域に一時記憶される各種データの具体例を示す図。
【図4】第1の実施の形態に係る自己診断処理手順を示すフローチャート。
【図5】第1の実施の形態に係る自己診断処理手順を示すフローチャート。
【図6】第1の実施の形態のバリエーション1に係る自己診断処理手順の一部を示すフローチャート。
【図7】、第1の実施の形態のバリエーション2に係る自己診断処理手順の一部を示すフローチャート。
【図8】第1の実施の形態のバリエーション2に係るリーダライタ用コマンドの概略のフォーマットを示す図。
【図9】第1の実施の形態のバリエーション3に係る自己診断処理手順の一部を示すフローチャート。
【図10】第1の実施の形態のバリエーション4に係る自己診断処理手順の一部を示すフローチャート。
【図11】第2の実施の形態の自己診断処理手順の一部を示すフローチャート。
【発明を実施するための形態】
【0014】
〔第1の実施の形態〕
図1は、第1の実施の形態に係るICカードの構成を概略的に示す図である。このICカード1は、非接触通信機能及び接触式通信機能をサポートする複合ICカードである。ICカード本体1a内にはICモジュール11が埋設されている。ICモジュール11は、ICチップ12、非接触通信手段としての非接触通信部13aおよび接触式通信手段としての接触端子13bを有し、これらは一体的にモジュール化されている。
ICカード1は、非接触通信部13aを介して非接触通信方式により非接触式カードリーダ・ライタ(外部装置)2aと通信を行なう。ICカード1は、接触端子13bを介して接触通信方式により接触式カードリーダ・ライタ(外部装置)2bと通信を行なう。
【0015】
ICチップ12は、CPU(セントラル・プロセッシング・ユニット)101、データメモリ102、RAM(ランダム・アクセス・メモリ)103、ROM(リード・オンリ・メモリ)104、非接触通信インターフェース(I/F)105a、および接触通信インターフェース(I/F)105b、105cを有して構成される。
【0016】
CPU101は、制御部として機能する。データメモリ102は、各種データを保持(記憶)するための記憶手段である。RAM103は、ワーキングメモリとして機能する記憶手段である。ROM104は、CPU101が実行するプログラムなどを格納した記憶手段である。非接触通信インターフェース(I/F)105aは、非接触通信部13aを介して非接触式カードリーダ・ライタ2aと授受される通信情報を仲介する。接触通信インターフェース(I/F)105b、105cは、接触端子13bを介して接触式カードリーダ・ライタ2bと授受される通信情報を仲介する。
【0017】
データメモリ102は、たとえば、EEPROMやフラッシュメモリなどの不揮発性メモリにより構成されていて、本実施形態では、256Kバイトの容量を有している。
【0018】
図2は、第1の実施の形態のデータメモリ102、RAM103およびROM104の構成を模式的に示す図である。
【0019】
ROM104には、プログラムコードおよびプログラムコードが破壊されていないことを確認するためのチェックコード期待値が格納されている。なお、チェックコード期待値は、プログラムコードの一部としてプログラムコード内にあらかじめ格納されている。
ROM104は、本実施形態では、たとえば、開始アドレスが[0x000000]、終了アドレスが[0x03FFFF]で、256Kバイトの容量を有している。
【0020】
RAM103には、領域103a〜103eが確保されている。
領域103aには、プログラムコード自己診断の結果情報である自己診断結果フラグが一時記憶される。領域103bには、自己診断が終了したアドレスが一時記憶される。領域103cには、中間結果あるいはチェックコード期待値と比較する最終結果となるチェックコード算出値が一時記憶される。領域103dには、所定のイニシャル状態から受信したコマンドの累積数が一時記憶される。領域103eには、一回の自己診断でチェックされるROM104のサイズが一時記憶される。
なお、RAM103は、本実施形態では、たとえば、40Kバイトの容量を有している。
【0021】
図3は、第1の実施の形態のRAM103の領域103a〜103eに一時記憶される各種データの具体例を示す図である。
【0022】
領域103aに一時記憶される自己診断結果フラグは、たとえば、1バイトのデータで、プログラムコード自己診断状況(未実施、実施中、終了)、および自己診断が終了している場合はその結果(正常、異常)を示す情報である。
【0023】
領域103bに一時記憶される自己診断終了アドレスは、たとえば、3バイトのデータで、前回コマンド処理終了時点で、プログラムコードのどの部分までの自己診断が終了したか(未実施、実施中、終了)、を一時記憶するための情報である。具体的には、その時点で自己診断が終了した最終のメモリアドレスを情報として記憶する。
【0024】
領域103cに一時記憶されるチェックコード算出値は、たとえば、2バイトのデータで、自己診断終了アドレスが、終了(つまり、プログラムコードの最終アドレス)を示していない場合は中間結果を表し、終了を示している場合は自己診断最終チェックコード値を表している。自己診断最終チェックコード値は、自己診断の合否判定を行なうためにプログラムコード内にあらかじめ格納されたチェックコード期待値と比較するためのデータである。
【0025】
領域103dに一時記憶されるコマンドカウンタは、例えば、2バイトのデータで、電源がオンされて活性化された初期状態、あるいは所定のイニシャル状態からのICカード2が受信したコマンドの累積数を示す情報である。
【0026】
領域103eに一時記憶される分割サイズは、自己診断を実施する際に、一回の自己診断でチェックされるROM104のサイズを示す情報である。
【0027】
図4、図5は、第1の実施の形態に係る自己診断処理手順を示すフローチャートである。なお、本フローチャートでは、ICカード1の全ての処理を詳細には記載せず、本実施形態の説明を行なう上で必要となる部分のみについて記載している。また、本フローチャートでは、説明を簡略化するために、特に断らない限り接触式カードリーダ・ライタ2bとの送受信について記載する。特に断らない限り非接触式カードリーダ・ライタ2aとの送受信も同様に行なわれる。
【0028】
ISO/IEC7816シリーズに規定された手順にしたがって活性化されることで、CPU101は、自己診断処理を開始する(ステップS1)。ステップS2において、CPU101は、RAM103の初期化を実行する。初期化によって、RAM103の領域103a〜103eに示した各一時記憶データに初期値が書き込まれる。
【0029】
ステップS3において、CPU101は、ISO/IEC7816シリーズの規定にしたがい、ATR(アンサー・ツー・リセット)を外部装置である接触式カードリーダ・ライタ2bへ送信する。ステップS4において、ATR送信後、CPU101は、接触式カードリーダ・ライタ2bからのコマンドを待つための受信待ちモードへ進む。接触式カードリーダ・ライタ2bからコマンドが送信されない場合、本ステップS4に留まり続ける。
【0030】
接触式カードリーダ・ライタ2bからコマンドを受信すると、ステップS5において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常または正常)」または「終了でない」のいずれかを判定する。
【0031】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」を示していた場合、何らかの原因によりプログラムコードが誤ったコードに書き換えられていることを示している。従ってこの場合は、このプログラムコードを実行することは中止すべきである。ステップS20において、CPU101は、コマンドの処理を実行せず、自己診断エラーを意味するステータスワード(SW)を接触式カードリーダ・ライタ2bへ応答する。そして、再びステップS4のコマンド受信待ち状態へ戻る。
【0032】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」でも「終了(正常)」でもない場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【0033】
ステップS6の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、CPU101は、ステップS7において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」に初期値を設定する。そして、ステップS10において、プログラムコード自己診断処理を実行する。
【0034】
ステップS6の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、CPU101は、今回の処理で自己診断を継続して再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。
【0035】
すなわち、ステップS8において、CPU101は、RAM103の領域103cに記憶されている中間結果のチェックコード算出値をセットする。ステップS9において、CPU101は、RAM103の領域103bに記憶されている自己診断終了アドレスに「+1」した値を自己診断開始アドレスにセットする。そして、ステップS10において、プログラムコード自己診断処理を実行する。
【0036】
ステップS10において、CPU101は、ROM104内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。
【0037】
ステップS10におけるプログラムコード自己診断の方法として、第1の実施の形態では、たとえば、CRC16演算を利用する。CRC16演算では、プログラムコードを途中までチェックした場合、それまでのチェック結果を保存しておき、プログラムコードのチェックを再開した場合は、保存したチェック結果を初期値として使用することでチェックを継続して実行することが可能である。
【0038】
ステップS10において、CPU101は、「開始アドレス」から自己診断を実行し、RAM103の領域103eに記憶された「分割サイズ」で指定されたサイズ分のプログラムコード自己診断処理を実行後、終了する。たとえば、1回の自己診断で実施するプログラムコード自己診断対象のデータサイズを64Kバイトとした場合、全プログラムコード領域に対する自己診断は、4回、つまり診断開始後、4コマンド目の処理時点で終了する。
【0039】
ステップS11において、CPU101は、プログラムコードの最終アドレスまで自己診断が終了したかをチェックする。このチェックの結果、ROM104の最終アドレスまで自己診断が終了している場合、ステップS12において、CPU101は、算出されたチェックコードと、あらかじめROM104のプログラムコードに格納されたチェックコード期待値とを比較する。
【0040】
ステップS12の比較の結果、両者の値が一致(自己診断成功)した場合(ステップS13 Yes)、ステップS14において、CPU101は、全てのプログラムコードが正しい値を保持している、即ちプログラムコードが壊れたり、改竄されたりしていない、と判断する。そしてCPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「終了(正常)」に設定し、ステップS15へ進む。
【0041】
ステップS12の比較の結果、両者の値が不一致の場合(ステップS13 No)、ステップS16において、CPU101は、プログラムコード自体に何らかの問題があると判断する。そしてCPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「終了(異常)」に設定し、ステップS20へ進む。
【0042】
ステップS11のチェックの結果、プログラムコードの最終アドレスまで自己診断が終了していない場合、ステップS17において、CPU101は、中間状態を保存するために、自己診断が終了した時点のアドレス(自己診断終了アドレス)、および、自己診断が終了した時点のチェックコード算出値をRAM103の領域103b,103cに保存する。
【0043】
ステップS18において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグを「実施中」に設定し、ステップS15へ進む。
【0044】
ステップS5の判定の結果、自己診断結果フラグが「終了(正常)」を示していた場合、CPU101は、ステップS6〜S14,S16〜S18を実施せずにステップS15へ進む。
【0045】
ステップS15において、CPU101は、接触式カードリーダ・ライタ2bから受信したコマンドの処理を開始する。ステップS19において、CPU101は、コマンド処理実行後、その処理結果に応じたステータスワード(SW)を接触式カードリーダ・ライタ2bへ応答し、再びステップS4のコマンド受信待ち状態へ戻る。
【0046】
以上説明したように上記第1の実施形態に係る動作によれば、ICカード1の活性化後、接触式カードリーダ・ライタ2bから最初のコマンドを受信した場合に、プログラムコードのチェックコード算出を、ROM104に格納されたプログラムコードの先頭アドレスから開始し、あらかじめRAM103に設定されたサイズまでのチェックコードを算出する。その時点で全プログラムコードのチェックコード算出が終了していない場合は、算出した中間のチェックコード、および、チェックコードの算出が終了した領域の最終チェック済アドレス情報をRAM103に一時保存する。その後に、コマンドの処理を実行しその結果を接触式カードリーダ・ライタ2bへ応答する。
【0047】
さらに後続のコマンドを受信した場合に、前回一時保存した最終チェック済アドレスおよび中間チェックコードを用いて、チェックコード算出が終了していないプログラムコードの先頭アドレスから同様にチェックコード算出を継続する。
【0048】
最終的に全てのプログラムコードについてチェックコード算出処理が終了した後で、あらかじめプログラムコード内に書込まれたチェックコード期待値と算出したチェックコードとを比較し、両者の値が一致した場合は、自己診断終了と判断して通常のコマンド処理結果を接触式カードリーダ・ライタ2bへ応答し、不一致の場合は、コマンド処理結果を破棄して、自己診断異常を意味するエラーコードを接触式カードリーダ・ライタ2bへ応答する。
【0049】
このように、プログラムコードの自己診断を1つのコマンド処理内で全て実行するのではなく、複数のコマンド処理毎に分割して実行する。
【0050】
〔第1の実施の形態のバリエーション1〕
第1の実施の形態のバリエーションでは、図1に示すように、ICカード1が複数の通信手段(通信インターフェース)を持つ場合の処理について説明する。
【0051】
図6は、第1の実施の形態のバリエーション1に係る自己診断処理手順の一部を示すフローチャートである。図6に示す処理は、図4のステップS5の処理に対応する。
【0052】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0053】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
【0054】
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS52において、受信したコマンドが所定の通信インターフェースを介して取得されたかどうかを調べる。通信インターフェースには、上述のように「非接触通信インターフェース」、「接触通信インターフェース」などがあり、それぞれ通信する情報の種類が異なる。また、「接触通信インターフェース」であっても、「USB」、「SWP」などがあり同様に通信する情報の種類が異なる。従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とが通信インターフェースによって識別できる場合は、対象通信インターフェースから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。そして、コマンド処理に長時間を要しても良い処理である場合には、自己診断処理を実行する。
【0055】
従って、対象通信インターフェースからのコマンドでない場合(ステップS52 No)は、自己診断処理を実行せず、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0056】
対象通信インターフェースからのコマンドである場合(ステップS52 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0057】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0058】
上述のようにバリエーション1に係る形態では、特定の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の通信手段経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0059】
〔第1の実施の形態のバリエーション2〕
図7は、第1の実施の形態のバリエーション2に係る自己診断処理手順の一部を示すフローチャートである。図7に示す処理は、図4のステップS5の処理に対応する。
【0060】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0061】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS54において、受信したコマンドが対象チャンネルからのものかどうかを調べる。
【0062】
図8は、第1の実施の形態のバリエーション2に係るリーダライタ用コマンドの概略のフォーマットを示す図である。
【0063】
図8は、リーダライタ用コマンドにおけるコマンドブロック内のDAT部のフォーマットである。このフォーマットの項目「CLA」(コマンドの層別)には、チャンネルの指定が0〜3の値で記載されている。例えば、チャネル指定が0のときは、チャネル0:携帯電話の3Gアプリを指定し、チャネル指定が1のときは、チャネル1:クレジットアプリを指定する。
【0064】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがチャネルによって識別できる場合は、対象チャネルから取得したコマンドは、コマンド処理に長時間を要しても良い処理であると判断することができる。
【0065】
従って、対象チャネルから取得したコマンドでない場合(ステップS54 No)は、自己診断処理を実行せず、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0066】
対象チャネルから取得したコマンドである場合(ステップS54 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0067】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0068】
上述のようにバリエーション2に係る形態では、当該ICカードが、ISO/IEC7816−4に規定される論理チャネルを少なくとも2つ以上持つ場合において、特定の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、他の論理チャネル経由で受信したコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0069】
〔第1の実施の形態のバリエーション3〕
図9は、第1の実施の形態のバリエーション3に係る自己診断処理手順の一部を示すフローチャートである。図9に示す処理は、図4のステップS5の処理に対応する。
【0070】
コマンドを受信すると、ステップS51において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判断する。
【0071】
自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。そこで上述のステップS20の処理を実行する。
自己診断結果フラグが「終了(異常)」を示していない場合、ステップS54において、受信したコマンドが対象とするコマンドかどうかを調べる。
【0072】
対象とするコマンドとは、コマンド処理に長時間を要するものである。例えば、ファイルのアクセスが含まれている処理が該当する。このようなコマンド処理を行なう場合は、それに併せて自己診断処理を実行した場合であっても、コマンド処理においてタイムアウトなどの不具合を発生させることを回避することができる。
【0073】
従って、コマンド処理に長時間を要しても良い処理と、コマンド処理が短時間で終了する必要がある処理とがコマンド名によって識別できる場合は、取得したコマンド名から、コマンド処理に長時間を要しても良い処理であると判断することができる。
【0074】
従って、取得したコマンドが対象コマンドでない場合(ステップS55 No)は、自己診断処理を実行せずに、ステップS15において、CPU101は、受信したコマンドの処理を開始する。
【0075】
取得したコマンドが対象コマンドである場合(ステップS55 Yes)は、ステップS53において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(正常)」かどうかを判断する。
【0076】
自己診断結果フラグが「終了(正常)」を示していた場合、ステップS15において、CPU101は、受信したコマンドの処理を開始する。自己診断結果フラグが「終了(正常)」を示していなかった場合、ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断して、対応する処理を実行する。
【0077】
上述のようにバリエーション3に係る形態では、当該ICカードが、特定のコマンドに対しては、チェックコードの算出処理を実行した後に、コマンドに対する処理を実行するが、その他のコマンドに対しては、チェックコードの算出処理を実行せずに、コマンドに対する処理のみを実行する。このように処理することで、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0078】
〔第1の実施の形態のバリエーション4〕
図10は、第1の実施の形態のバリエーション4に係る自己診断処理手順の一部を示すフローチャートである。図10に示す処理は、図4のステップS6〜S10の処理に対応する。バリエーション4に係る形態では、自己診断の分割数を指定したコマンドを外部装置から受信する。
【0079】
ステップS6において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。
【0080】
ステップS6の判定の結果、自己診断結果フラグが、「未実施」を示していた場合、CPU101は、ステップS7において、初回の自己診断を開始するために、自己診断処理に受け渡すパラメータである「開始アドレス」、「チェックコード算出値」を設定する。なお、「開始アドレス」、「チェックコード算出値」は初期値である。そして、ステップS56の処理を実行する。
【0081】
ステップS6の判定の結果、自己診断結果フラグが、「実施中」を示していた場合、CPU101は、今回の処理で自己診断を再開するために、前回コマンドで行なった自己診断の中間情報をRAM103から復帰する。
【0082】
すなわち、ステップS8において、CPU101は、RAM103の領域103cに記憶されている中間結果のチェックコード算出値をセットする。ステップS9において、CPU101は、RAM103の領域103bに記憶されている自己診断終了アドレスに「+1」した値を自己診断開始アドレスにセットする。そして、ステップS56の処理を実行する。
【0083】
ステップS56において、CPU101は、取得したコマンドが、自己診断をいくつの回数Nに分割して実行するか、を指定する専用のコマンドかどうかを調べる。
専用のコマンドでない場合は、ステップS10の自己診断処理を実行する。
専用のコマンドである場合は、ステップS57において、CPU101は、分割した1回当たりにチェックするプログラムコードのサイズを求め、領域103eの「分割サイズ」にセットする。1回当たりにチェックするプログラムコードのサイズSは、プログラムコードの全サイズT、分割数Nを用いて次の式(1)で表される。
【0084】
S=[T/N]+1 ・・・式(1)
ここで、演算[ ]は、演算結果の小数点以下を切り捨てて整数値とするガウスの記号である。なお、演算結果が割り切れて整数値となる場合は、次の式(2)で表される。
【0085】
S=[T/N] ・・・式(2)
ステップS10において、CPU101は、ROM104内のプログラムコードに対する自己診断を実行する。この自己診断では、上記セットされた「開始アドレス」、「チェックコード算出値」を用いる。また、領域103eの「分割サイズ」で表されるサイズだけのコードをチェックする。
【0086】
なお、ステップS57において、コマンド処理を行なったため、図5のステップS15に示すコマンド処理は実行しない。
【0087】
上述のようにバリエーション4に係る形態では、分割数を指定した専用のコマンドを受信した場合に、プログラム領域のサイズおよび指定された分割数から、1つのコマンドを受信した際に行うべきチェックコード算出サイズを決定する。従って、適切な分割数で自己診断を行なうことができるため、コードチェックを実行する際にコマンド処理に不具合が発生することを回避することができる。
【0088】
〔第2の実施の形態〕
図11は、第2の実施の形態の自己診断処理手順の一部を示すフローチャートである。図11に示す処理では、ステップS35の処理が第1の実施の形態と異なっている。第1の実施の形態と同一の部位には同一の符号を付してその詳細の説明は省略する。
【0089】
ステップS31〜S34の処理は、第1の実施の形態のステップS1〜S4の処理と同じであるためその説明は省略する。
【0090】
ステップ35において、CPU101は、RAM103の領域103aに記憶されている自己診断結果フラグの状態をチェックし、「終了(異常)」かどうかを判定する。
【0091】
ステップS35の判定の結果、自己診断結果フラグが「終了(異常)」を示していた場合、プログラムコードが誤ったコードに書き換えられているため、このプログラムコードを実行することは中止すべきである。この後の処理は第1の実施の形態と同一であるため詳細の説明は省略する。
【0092】
ステップS5の判定の結果、自己診断結果フラグが「終了(異常)」でない場合、ステップS36において、CPU101は、自己診断を新規に開始するか、または中断状態から継続再開するかを判断する。すなわち、CPU101は、自己診断結果フラグが「実施中」を示しているか、「未実施」を示しているかを判定する。この後の処理は第1の実施の形態と同一であるため詳細の説明は省略する。
【0093】
この第2の実施の形態によれば、ステップS35では、第1の実施の形態と異なって自己診断結果フラグの状態が「終了(正常)」かどうかを判断していない。従って、自己診断結果フラグの状態が「終了(異常)」でなければ、自己診断が終了した後も、後続するコマンドを受信したときに新たに自己診断を開始する。
【0094】
第1の実施の形態では、コマンドを受信するごとに分割して自己診断を実施することができるため、コマンド処理において不具合が発生することを回避することができ、ICカードの信頼度を維持向上することができる。
【0095】
〔第2の実施の形態のバリエーション〕
第2の実施の形態のバリエーションの形態では、自己診断が終了した後に、所定数のコマンドを受信する毎に自己診断を再度実行する。
【0096】
この動作は次のようにして実現することができる。例えば、自己診断が終了したときは、領域103dのコマンドカウンタの値を0にリセットする。そして、以降コマンドを受信するごとにこのコマンドカウンタの値を+1カウントアップする。そしてコマンドカウンタの値が所定の値C以上であるときに再度分割した自己診断の実行を制御する。この動作を繰り返すことで、コマンドを所定数Cだけ受取るごとに自己診断を実施することができる。なお、上述の第2の実施の形態は、所定の値C=1の場合に相当する。
【0097】
なお、上述の各実施の形態で説明した機能は、ハードウェアを用いて構成するに留まらず、ソフトウェアを用いて各機能を記載したプログラムをコンピュータに読み込ませて実現することもできる。また、各機能は、適宜ソフトウェア、ハードウェアのいずれかを選択して構成するものであっても良い。
【0098】
尚、本発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。
上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【0099】
例えば、第1の実施の形態、第2の実施の形態、及びそれぞれのバリエーションの形態を適宜組み合わせて構成することができる。
【符号の説明】
【0100】
1…ICカード、1a…ICカード本体、2a…非接触式カードリーダ・ライタ、2b…接触式カードリーダ・ライタ、2…ICカード、11…ICモジュール、12…ICチップ、13a…非接触通信部、13b…接触端子、101…CPU、102…データメモリ、103…RAM、103a〜103e…領域、104…ROM、105a…非接触通信インターフェース、105b.105c…接触通信インターフェース。
【特許請求の範囲】
【請求項1】
外部からのコマンドを解釈実行し、その結果を応答するICカードにおいて、
前記ICカードで実行されるプログラムを格納するプログラム領域と、
外部からコマンドを受信する受信部と、
前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部は、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするICカード。
【請求項2】
前記ICカードは、複数の通信インターフェースを有し、
前記所定のコマンドは、特定の前記通信インターフェースを介して受信したコマンドであること
を特徴とする請求項1に記載のICカード。
【請求項3】
前記ICカードは、少なくとも2つのISO/IEC7816−4に規定される論理チャネルを有し、
前記所定のコマンドは、特定の前記チャネルを介して受信したコマンドであること
を特徴とする請求項1に記載のICカード。
【請求項4】
前記所定のコマンドは、特定の処理の実行を指示するコマンドであることを特徴とする請求項1に記載のICカード。
【請求項5】
前記制御部は、前記プログラムコードの良否判断を、外部からのコマンドで指示された分割数に分割して実行することを特徴とする請求項1に記載のICカード。
【請求項6】
前記制御部は、前記プログラムコードの良否診断結果が不良のときは、以降に受信するコマンドに対応する処理、及び以降のプログラムコードの良否判断を実行しないことを特徴とする請求項1に記載のICカード。
【請求項7】
前記制御部は、全プログラムコードの良否診断を終了した後は、外部からのコマンドを予め定めた所定数以上受信した後であって、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項1に記載のICカード。
【請求項8】
前記制御部は、全プログラムコードの良否診断を終了した後は、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項1に記載のICカード。
【請求項9】
前記プログラムコードの良否診断は、CRC16演算を利用して実行されることを特徴とする請求項1乃至8のいずれか1項に記載のICカード。
【請求項10】
外部からのコマンドを解釈実行し、その結果を応答するICカードにおけるプログラムコードの診断方法であって、
前記ICカードは、当該ICカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部が、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、
前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするプログラムコードの診断方法。
【請求項1】
外部からのコマンドを解釈実行し、その結果を応答するICカードにおいて、
前記ICカードで実行されるプログラムを格納するプログラム領域と、
外部からコマンドを受信する受信部と、
前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部は、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするICカード。
【請求項2】
前記ICカードは、複数の通信インターフェースを有し、
前記所定のコマンドは、特定の前記通信インターフェースを介して受信したコマンドであること
を特徴とする請求項1に記載のICカード。
【請求項3】
前記ICカードは、少なくとも2つのISO/IEC7816−4に規定される論理チャネルを有し、
前記所定のコマンドは、特定の前記チャネルを介して受信したコマンドであること
を特徴とする請求項1に記載のICカード。
【請求項4】
前記所定のコマンドは、特定の処理の実行を指示するコマンドであることを特徴とする請求項1に記載のICカード。
【請求項5】
前記制御部は、前記プログラムコードの良否判断を、外部からのコマンドで指示された分割数に分割して実行することを特徴とする請求項1に記載のICカード。
【請求項6】
前記制御部は、前記プログラムコードの良否診断結果が不良のときは、以降に受信するコマンドに対応する処理、及び以降のプログラムコードの良否判断を実行しないことを特徴とする請求項1に記載のICカード。
【請求項7】
前記制御部は、全プログラムコードの良否診断を終了した後は、外部からのコマンドを予め定めた所定数以上受信した後であって、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項1に記載のICカード。
【請求項8】
前記制御部は、全プログラムコードの良否診断を終了した後は、前記所定のコマンドを受信したときに前記プログラムコードの良否診断を改めて実行することを特徴とする請求項1に記載のICカード。
【請求項9】
前記プログラムコードの良否診断は、CRC16演算を利用して実行されることを特徴とする請求項1乃至8のいずれか1項に記載のICカード。
【請求項10】
外部からのコマンドを解釈実行し、その結果を応答するICカードにおけるプログラムコードの診断方法であって、
前記ICカードは、当該ICカードで実行されるプログラムを格納するプログラム領域と、外部からコマンドを受信する受信部と、前記コマンドに対応した処理、及び前記プログラム領域内のプログラムについてプログラムコードの良否診断処理を実行する制御部とを有し、
前記制御部が、
前記プログラムコードの良否診断を、前記受信部が所定のコマンドを受信する毎の複数回に分割して実行し、
前記分割された良否診断を実行した後で当該所定のコマンドの処理を実行すること
を特徴とするプログラムコードの診断方法。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【公開番号】特開2013−11988(P2013−11988A)
【公開日】平成25年1月17日(2013.1.17)
【国際特許分類】
【出願番号】特願2011−143431(P2011−143431)
【出願日】平成23年6月28日(2011.6.28)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
【公開日】平成25年1月17日(2013.1.17)
【国際特許分類】
【出願日】平成23年6月28日(2011.6.28)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
[ Back to top ]