(57)【要約】【課題】複数のメッセージデータについてHMACを効率よく演算することができる。【解決手段】HMAC演算回路100は、処理状態を管理するHMAC制御回路129と、秘密鍵データK、メッセージデータMそれぞれに関するダイジェスト値を算出するハッシュ演算回路128とを備える。ハッシュ演算回路128は、ダイジェスト値の算出処理を中断する場合に、途中経過を記憶部300に出力する。ハッシュ演算回路128が、ダイジェスト値の算出を再開する場合、途中経過が入力され、途中経過を用いて算出処理を行う。秘密鍵データKのダイジェスト値の算出再開のためには、再開信号を1、秘密鍵・メッセージ指定信号を0とした信号を、メッセージデータMに関するダイジェスト値の算出再開のためには、再開信号を1、秘密鍵・メッセージ指定信号を0とした信号をHMAC制御回路129に入力する。【選択図】図２
2011254440.tif 000002
【特許請求の範囲】
【請求項１】
HMACを求める情報処理装置であって、
入力された秘密鍵データＫの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B)よりも短い場合に、前記秘密鍵データKに対して、0を連接して第1の鍵データK0を生成し、前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)と等しい場合、前記秘密鍵データKを第2の鍵データK0とし、前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)よりも長い場合に、前記秘密鍵データKのダイジェスト値である第1のダイジェスト値H(K)に対して０を連接して第3の鍵データK0を生成し、前記第1の鍵データK0、前記第2の鍵データK0、又は前記第3の鍵データK0のいずれかに対して第1の定数ipadとの排他的論理和を行い第1のデータ（K0 xor ipad）を算出するパディング回路と、
前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)より長い場合に、前記第１のダイジェスト値H(K)を求めるとともに、前記第1のデータ（K0 xor ipad）と入力されたメッセージデータMとを連接したデータ(K0 xor ipad) || M)のダイジェスト値である第2のダイジェスト値H(K0 xor ipad) || M)を求めるハッシュ演算回路と、
前記秘密鍵データK、または前記第1のダイジェスト値H(K)を記憶する保持回路と、
HMAC算出のための処理状態を管理する制御部とを備え、
前記ハッシュ演算回路は、前記第1のダイジェスト値H(K)の算出処理を途中で中断する場合に、前記中断までに算出した前記第1のダイジェスト値H(K)の途中経過を外部に出力し、前記第1のダイジェスト値H(K)の算出処理を再開する場合、前記第1のダイジェスト値H(K)の途中経過が入力され、前記第1のダイジェスト値H(K)の途中経過を用いて、前記第1のダイジェスト値H(K)を算出し、
前記ハッシュ演算回路は、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を途中で中断する場合に、前記中断までに算出した前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過を外部に出力し、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を再開する場合、前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過が入力され、前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過を用いて、前記第2のダイジェスト値H(K0 xor ipad) || M)を算出し、
前記保持回路は、前記ハッシュ演算回路が、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を途中で中断する場合に、前記秘密鍵データK、又は前記第1のダイジェスト値H(K)を外部に出力し、前記ハッシュ演算回路が、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を再開する場合に、前記秘密鍵データK又は前記第1のダイジェスト値H(K)が入力され、
前記制御部に前記第1のダイジェスト値H(K)の算出処理の再開指示を示す信号を入力した場合に、前記ハッシュ演算回路は、前記第1のダイジェスト値H(K)の算出処理を再開し、
前記制御部に前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理の再開指示を示す信号を入力した場合に、前記ハッシュ演算回路は、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を再開することを特徴とする
情報処理装置。
【請求項２】
前記第1のダイジェスト値H(K)の途中経過の入力を指示する信号を入力した場合に、前記ハッシュ演算回路に前記第1のダイジェスト値H(K)の途中経過を入力することを特徴とする前記請求項1記載の情報処理装置。
【請求項３】
前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過の入力を指示する信号を入力した場合に、前記ハッシュ演算回路に前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過を入力することを特徴とする請求項2記載の情報処理装置。
【請求項４】
前記ハッシュ演算回路は、前記第1のダイジェスト値H(K)を求める際に、前記秘密鍵データKをn個に分割した分割秘密鍵（ K0, K1, K2,…,Kn）に対して、K0, K1, K2,…Kn-1,Kn（若しくはKnに0を連接したデータ）の順番でハッシュ演算を繰り返し行うことにより、前記第１のダイジェスト値H(K)（＝H（K0, K1, K2,…,Kn））を算出し、
前記ハッシュ演算回路は、前記第1のダイジェスト値H（K0, K1, K2,…,Kn）の算出処理を中断する場合であって、前記算出処理のうち分割秘密鍵K0, K1, K2,…Kiについてハッシュ演算を行っている場合、前記第1のダイジェスト値H（K0, K1, K2,…,Kn）の算出処理の途中経過としてH（K0, K1, K2,…,Ki）を出力し、
前記第1のダイジェスト値H(K)の算出処理を再開する場合、前記ハッシュ演算回路に前記途中経過H（K0, K1, K2,…,Ki）が入力され、分割秘密鍵Ki＋1,…,Knが入力され、前記第1のダイジェスト値H（K0, K1, K2,…,Kn））を算出することを特徴とする
請求項3記載の情報処理装置。
【請求項５】
前記ハッシュ演算回路は、前記第2のダイジェスト値H(K0 xor ipad) || M)を求める際に、前記メッセージデータをn個に分割したメッセージデータブロック(M0, M1, M2,…,Mn）に対して、M0, M1, M2,…,Mn（若しくはMnに0を連接したデータ）の順番でハッシュ演算を繰り返し行い、第2のダイジェスト値H(K0 xor ipad) || M)(=H((K0 xor ipad) || M0, M1, M2,…,Mn))
を算出し、
前記ハッシュ演算回路は、前記第２のダイジェスト値H(K0 xor ipad) || M)の算出処理を途中で中断する場合であって、前記算出処理のうちメッセージデータブロック （M0, M1, M2,…,Mi）についてハッシュ演算を行っている場合、前記第２のダイジェスト値の算出処理の途中経過としてH((K0 xor ipad) || M0, M1, M2,…,Mi)を出力し、
前記第２のダイジェスト値の算出処理を再開する場合、前記途中経過H((K0 xor ipad) || M0, M1, M2,…,Mi)が入力され、メッセージデータブロックMi＋1,…,Mnが入力され、前記第２のダイジェスト値H((K0 xor ipad) || M0, M1, M2,…,Mn)を算出することを特徴とする
請求項4記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置にかかわり、特にデータの改ざん検出機能を有する情報処理装置に関する。
【背景技術】
【０００２】
インターネットを介してデータの送受信を行う場合に、データの改ざんが行われていないことを確認するために、メッセージ認証コード(Message Authentication Code ：MAC)が用いられている。
【０００３】
メッセージ認証コードのアルゴリズムの1つとして、メッセージ認証コードのための鍵つきハッシング(Keyed-Hashing for Message Authentication Code ：HMAC)というアルゴリズムがある(非特許文献１)。
【０００４】
また、HMACを生成するための回路構成の例については、例えば、特許文献１や特許文献２に開示されている。
【０００５】
送信側端末が、インターネットを介して秘密鍵とメッセージデータとHMACとを送信し、受信側端末が、秘密鍵とメッセージデータと送信側端末が生成したHMACとを受け取ると、受信側端末は、秘密鍵とメッセージデータとを用いてHMACの演算を行うことができる。
【０００６】
受信側端末が受信したHMACの値と受信側端末自身が演算して求めたHMACの値とが一致しなかった場合、受けとったメッセージデータが、送信側端末から受信側端末に渡る前に改ざんされたか、あるいはメッセージデータが正しく受信できなかったか、あるいはメッセージデータの送信側端末は受信側端末が想定していない端末であったことなどが考えられる。いずれの場合においても、受信側端末が受け取ったメッセージデータは信頼できないデータであることを判断することができる。
【０００７】
一方、受信したHMACの値と受信側端末自身が演算して求めたHMACの値とが一致した場合、受け取ったメッセージデータは受信側端末が想定する者から送られたメッセージデータであることを確認でき、信頼できるメッセージデータであることを判断できる。このようにHMACを用いることで、インターネットを介してメッセージデータの受け渡しを安全に行うことが可能となる。
【０００８】
図4に、非特許文献1で示されたHMACの演算手順のフローチャートを示す。以下では、図4を用いて、非特許文献1で示されたHMACの演算手順を説明する。ステップＳ１からステップＳ３のいずれかのステップで、受信した秘密鍵Kから鍵データK0を生成する。ステップＳ０で秘密鍵Kのサイズ(Length(K))とハッシュ関数のブロック長(Length(B))を比較する。
【０００９】
ステップＳ１では、秘密鍵Kのサイズ(Length(K))とハッシュ関数のブロック長(Length(B))が等しい場合、秘密鍵Kを鍵データK0として、ステップＳ４に進む。
【００１０】
ステップＳ２で、秘密鍵Kのサイズ(Length(K))がハッシュ関数のブロック長(Length(B))よりも長い場合に、秘密鍵Kをハッシュ関数Hで演算して秘密鍵のダイジェスト(H(K))を求め、得られた結果H(K)に対してハッシュ関数のブロック長となるまで0を追加し鍵データK0を生成する。K0を生成すると、ステップＳ４に進む。ハッシュ関数のブロック長(Length(B))のほうが、秘密鍵Kのサイズ(Length(K))よりも長い場合（Length(B) > Length(K))にはステップＳ３に進む。
【００１１】
ステップＳ３では、Length(B) > Length(K)なので、秘密鍵K にLength(B)となるまでに0を付加して、その結果を鍵データK0とする。K0を生成すると、ステップ4に進む。
【００１２】
ステップＳ４では、定数ipadとステップＳ１からステップＳ３いずれかで生成した鍵データK0とを排他的論理和演算（xor）して、データ（K0 xor ipad）を求める。
【００１３】
ステップＳ５では、ステップ4の演算結果（K0 xor ipad）にHMACを求めたいメッセージデータtextを連接したデータ（K0 xor ipad||text）を生成する。
【００１４】
ステップＳ6では、ステップＳ5で生成したデータ（K0 xor ipad||text）をハッシュ関数Hで演算し、そのダイジェストH（K0 xor ipad||text）を求める。
【００１５】
ステップＳ７では、K0と定数opadとの値を排他的論理和演算して、データ（K0 xor opad）を求める。
【００１６】
ステップＳ８では、ステップ7の演算結果（K0 xor opad）にステップＳ６の演算結果H（K0 xor ipad||text）を連接したデータ（ K0 xor opad ）||H（ K0 xor ipad || text）を生成する。
【００１７】
ステップＳ９では、ステップＳ８で生成したデータ（ K0 xor opad ）||H（ K0 xor ipad || text）のダイジェストH（（ K0 xor opad ）||H（ K0 xor ipad || text））を作成する。
【００１８】
ステップＳ10では、ステップＳ９で求めたデータH（（ K0 xor opad ）||H（ K0 xor ipad || text））の左側からtバイトの値を求め、その値をHMACとする。
【先行技術文献】
【特許文献】
【００１９】
【特許文献１】特開2007-164589号公報
【特許文献２】特開2002-162904号公報
【非特許文献】
【００２０】
【非特許文献１】NIST, FIPS PUB 198. FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION.“The keyed-Hash Message Authentication Code(HMAC)”
【発明の概要】
【発明が解決しようとする課題】
【００２１】
ところで、受信側端末は、複数のメッセージデータを受信した場合には、メッセージデータ毎に上記S1〜S10の手順にしたがって、HMACを求める。このような場合、複数のメッセージデータのHMAC演算を同時に行うことができるようにHMAC回路が対応していない場合には、ある一つのメッセージデータのHMACの計算をしている間は、別のメッセージデータについてのHMACの計算を行うことができない。
【００２２】
前述したように、受信側端末は、秘密鍵とメッセージデータとを用いてHMACの演算を行い、秘密鍵とメッセージデータいずれも全てのデータの受信を完了しないと、HMACの算出完了することができない。一方、送信側端末は、1つの秘密鍵を複数のパケットに分けて送信する場合や1つのメッセージデータを複数のパケットに分けて送信する場合がある。
【００２３】
ネットワークの状況によっては、HMAC算出のための演算中に、秘密鍵の一部のパケットやメッセージデータの一部のパケットの到着に時間がかかり、HMAC回路が次のパケットを待つ状態のままになって、既に到着している別のメッセージデータのHMACの計算が待たされ、演算効率が低下するという問題がある。
【００２４】
本発明は、上記の問題点を解決するためになされたものであって、複数のメッセージデータについてそれぞれのHMACを効率よく演算することができる情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００２５】
本発明の一観点にかかる情報処理装置は、HMACを求める情報処理装置であって、入力された秘密鍵データＫの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B)よりも短い場合に、前記秘密鍵データKに対して、0を連接して第1の鍵データK0を生成し、前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)と等しい場合、前記秘密鍵データKを第2の鍵データK0とし、前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)よりも長い場合に、前記秘密鍵データKのダイジェスト値である第1のダイジェスト値H(K)に対して0を連接して第3の鍵データK0を生成し、前記第1の鍵データK0、前記第2の鍵データK0、又は前記第3の鍵データK0のいずれかに対して第1の定数ipadとの排他的論理和を行い第1のデータ（K0 xor ipad）を算出するパディング回路と、前記秘密鍵長(Length(K))が前記ハッシュ関数のブロック長(Length(B)より長い場合に、前記第１のダイジェスト値H(K)を求めるとともに、前記第1のデータ（K0 xor ipad）と入力されたメッセージデータMとを連接したデータ(K0 xor ipad) || M)のダイジェスト値である第2のダイジェスト値H(K0 xor ipad) || M)を求めるハッシュ演算回路と、前記秘密鍵データK、または前記第1のダイジェスト値H(K)を記憶する保持回路と、HMAC算出のための処理状態を管理する制御部とを備え、前記ハッシュ演算回路は、前記第1のダイジェスト値H(K)の算出処理を途中で中断する場合に、前記中断までに算出した前記第1のダイジェスト値H(K)の途中経過を外部に出力し、前記第1のダイジェスト値H(K)の算出処理を再開する場合、前記第1のダイジェスト値H(K)の途中経過が入力され、前記第1のダイジェスト値H(K)の途中経過を用いて、前記第1のダイジェスト値H(K)を算出し、前記ハッシュ演算回路は、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を途中で中断する場合に、前記中断までに算出した前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過を外部に出力し、前記第2のダイジェスト値H(K0 xor ip
ad) || M)の算出処理を再開する場合、前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過が入力され、前記第2のダイジェスト値H(K0 xor ipad) || M)の途中経過を用いて、前記第2のダイジェスト値H(K0 xor ipad) || M)を算出し、前記保持回路は、前記ハッシュ演算回路が、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を途中で中断する場合に、前記秘密鍵データK、又は前記第1のダイジェスト値H(K)を外部に出力し、前記ハッシュ演算回路が、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を再開する場合に、前記秘密鍵データK又は前記第1のダイジェスト値H(K)が入力され、前記制御部に前記第1のダイジェスト値H(K)の算出処理の再開指示を示す信号を入力した場合に、前記ハッシュ演算回路は、前記第1のダイジェスト値H(K)の算出処理を再開し、前記制御部に前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理の再開指示を示す信号を入力した場合に、前記ハッシュ演算回路は、前記第2のダイジェスト値H(K0 xor ipad) || M)の算出処理を再開することを特徴とする。
【発明の効果】
【００２６】
本発明によれば、複数のメッセージデータについてそれぞれのHMACを効率よく演算することができる情報処理装置が得られる効果がある。
【図面の簡単な説明】
【００２７】
【図１】本発明の一実施例にかかわる通信システムの構成を示すブロック図である。
【図２】本発明の実施例にかかわるHMAC演算回路100の構成例を示すブロック図である。
【図３】本発明の実施例にかかわるHMAC演算回路100の状態を示すステートマシンの状態遷移グラフである。
【図４】FIPS PUB  198で定められている従来のHMACの演算手順を示すフローチャートを示す図である。
【発明を実施するための形態】
【００２８】
以下、本発明の実施例について説明する。 
図1は、本発明の一実施例の情報処理装置にかかわる通信システムの構成を示すブロック図である。
【００２９】
この通信システムにおいて通信装置1000は、複数の通信装置500、600とネットワーク400により接続されている。通信装置1000は、HMAC演算回路100とインターフェース200と記憶部300を含む構成である。
【００３０】
通信装置1000のインターフェース200は、ネットワークを介して、通信装置500や通信装置600から秘密鍵及び秘密鍵のデータ長とメッセージデータ及びメッセージデータのデータ長とメッセージデータに対応するHMACを受信する。
【００３１】
HMAC演算回路100は、受信した秘密鍵とメッセージデータとからHMACを算出し、受信したHMACと算出したHMACとを比較し、一致する場合は、メッセージデータが信頼できるものと判断し、異なる場合は、メッセージデータが信頼できないものと判断する。
【００３２】
この実施形態に係わるHMAC演算回路100の構成例を、図２に示す。図３にHMAC演算回路100の状態遷移グラフを示す。HMAC演算回路の状態遷移は、HMAC制御回路129が管理する。
【００３３】
後で詳しく説明するが、図３に示すHMACの演算において、ネットワークを介してデータを得る場合、処理が進まない２つの場合が考えられる。１つは、ステップＳ１２において秘密鍵Kがハッシュ関数のブロック長Bよりも長くかつ秘密鍵Kのデータが受信に時間がかかる場合であり、もう１つは、ステップＳ１８においてメッセージデータがハッシュ関数のブロック長Bよりも長くメッセージデータの受信に時間がかかる場合である。これらを解決するために、図２に示す本発明一実施例のHMAC演算回路100は、秘密鍵・メッセージデータ指定信号線１２６と再開信号線１２７を備えている。
【００３４】
以下では、図２のHMAC演算回路100の構成について説明する。
【００３５】
HMAC演算回路100は、セレクタ120と、パディング回路121と、メッセージデータ拡張回路122と、セレクタ123と、K保持回路124と、メッセージデータ保持回路125と、ハッシュ演算回路128と、HMAC制御回路129と、セレクタ140と、セレクタ141と定数回路142とを有する。
【００３６】
セレクタ120は、外部から入力される制御信号（図示はせず。）が“０”である場合、秘密鍵・メッセージ入力信号線119により入力された信号をパディング回路121に出力し、外部から入力される制御信号が“１”である場合、K保持回路124から入力されたデータをパディング回路121に出力する。
【００３７】
パディング回路121は、入力された秘密鍵データKの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))よりも短い場合に、秘密鍵データKに対して0を連接（パディング）して、データ長が、ハッシュ関数のブロック長(Length(B))と等しい鍵データK0を生成する回路である。また、秘密鍵Kのダイジェスト値H（K）（ダイジェスト値H（K）については、後述する。）に対して、0を連接（パディング）して、データ長が、ハッシュ関数のブロック長(Length(B))と等しい鍵データK0を生成する回路である。また、秘密鍵データKをn個のデータ（分割秘密鍵と称する。）（ K0, K1, K2,…,Kn）に分割した場合のｎ番目のデータである分割秘密鍵（Kn）のデータ長が、ハッシュ関数のブロック長(Length(B))よりも短い場合に、分割秘密鍵（Kn）に対して、0を連接（パディング）する回路である。また、メッセージデータのデータ長Length(M)が、ハッシュ関数のブロック長Length(B)より短い場合に、メッセージデータMに対して、データ長がLength(B)となるまで0を連接（パディング）する回路である。また、メッセージデータMをn個のメッセージデータブロックM0, M1, M2,…,Mnに分割した場合のｎ番目のデータであるメッセージデータブロックMnのデータ長が、Length(B)より短い場合に、メッセージデータブロックMnに対して、データ長がLength(B)となるまで0を連接（パディング）する回路である。また、H(K0 xor ipad) || M)（H(K0 xor ipad) || M)については後述する。）に対して、データ長が、Length(B)となるまで0を連接（パディング）する回路である。また、鍵データ（K0）に対して仕様で定められた定数ipadとの排他的論理和演算を行い、（K0 xor ipad）を生成する回路である。また、鍵データ（K0）に対して仕様で定められた定数opadとの排他的論理和演算を行い、（K0 xor opad）を生成する回路である。尚、鍵データK0は、秘密鍵データKの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))と等しい場合は、秘密鍵データKであり、鍵データK0は、秘密鍵データKの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))より短い場合は、秘密鍵データKに対して0を連接（パディング）したデータであり、秘密鍵データKの秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))より長い場合は、秘密鍵Kのダイジェスト値H（K）に対して、0を連接（パディング）したデータである。
【００３８】
メッセージデータ拡張回路122は、後述するメッセージデータ保持回路125に保持されたデータを入力として受け取ると、メッセージデータの拡張演算を行った結果を、セレクタ123を介して再びメッセーデータ保持回路125に出力する。ここで、拡張演算とは、ハッシュアルゴリズムで定義された入力されたメッセージデータに対する演算であり、この具体的な演算はハッシュアルゴリズム毎に応じて決められている。
【００３９】
セレクタ123は、HMAC制御回路129から入力される制御信号（図示はせず。）が“１”である場合、パディング回路121から入力されたデータをメッセージデータ保持回路125に出力し、HMAC制御回路129から入力される制御信号が“０”である場合、メッセージデータ拡張回路122から入力されたデータをメッセージデータ保持回路125に出力する。
【００４０】
K保持回路124は、秘密鍵データK、秘密鍵データKのダイジェスト値H（K）が書き込まれ、それらのデータを保持する回路である。また、K保持回路124は、H((K0 xor ipad) || M)を、一旦ハッシュ演算回路128から書き込み、ハッシュ演算回路128から一時的に退避させる回路である。
【００４１】
また、K保持回路124は、ある秘密鍵データとあるメッセージデータについてダイジェストH((K0 xor ipad) || M)を求めている途中で、別の秘密鍵データKと別のメッセージデータMの演算が先に実行することができる場合に、保持している秘密鍵データK又はH（K）を、K出力信号線133を用いて、記憶部300の秘密鍵データ記憶回路300aに出力する。また、この記憶部300の秘密鍵データ記憶回路300aに退避しておいたKまたはH(K)は、秘密鍵・メッセージ入力信号線119により再び入力され、セレクタ140に、K書き込み信号線135を用いてK書き込み信号を1とした信号を入力することにより、K保持回路124に再び入力される。
【００４２】
メッセージデータ保持回路125は、パディング回路121によって書き込まれる（K0 xor ipad）、（K0 xor opad）を保持する回路である。また、分割秘密鍵Ki (i=0,…,n)が書きこまれて保持する回路である。また、分割秘密鍵（Kn）に０を連接したデータを保持する回路である。また、メッセージデータMに対して、0を連接したデータが書き込まれ、保持する回路である。また、H(K0 xor ipad) || M)に対して、0を連接したデータが書き込まれ、保持する回路である。また、メッセージデータ保持回路125は、メッセージデータ拡張演算回路122の演算結果をセレクタ123経由で受け取り保持する回路である。
【００４３】
ハッシュ演算回路128は、秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))より長い場合に、秘密鍵Kのダイジェスト(H(K))を求める。この場合、秘密鍵Kをn個のデータ（分割秘密鍵と称する。）（K0, K1, K2,…,Kn）に分割し、K0, K1, K2,…Kn-1,Kn（若しくはKnに0を連接したデータ）の順番でハッシュ演算回路128に入力し、ハッシュ演算を繰り返し行う。その結果、秘密鍵Kのダイジェスト値H(K)（＝H（K0, K1, K2,…,Kn）を求めることができる。ここで、K0, K1, K2,…,Kn-1のデータ長はハッシュ関数のブロック長と等しい。Knのデータ長は、ハッシュ関数のブロック長以下である。
【００４４】
また、ハッシュ演算回路128は、秘密鍵KのダイジェストH(K)を求めている時に、分割秘密鍵（K0, K1, K2,…,Kn）のうち、Kiまで到着し、H(K)を求めるための次のデータKi＋1が到着する前に、別の秘密鍵K（K2とする。）のデータが揃った場合、HMAC出力信号線130によりH(K)の中間結果（H（K0, K1, K2,…,Ki）を出力し、記憶装置300の秘密鍵データ記憶回路300aに記録しておく。記憶装置300に記録された秘密鍵Kの途中結果H（K0, K1, K2,…,Ki）は、秘密鍵Kのダイジェストの演算途中から再開させる場合に、ハッシュ演算回路128に戻される。そのために、ハッシュ初期値入力信号線132にH（K0, K1, K2,…,Ki）を入力し、再開信号線127に流す再開信号を1としてセレクタ141に入力することにより、途中結果H（K0, K1, K2,…,Ki）は、ハッシュ演算回路128内にあるダイジェスト値記憶回路143に書き込まれる。
【００４５】
また、ハッシュ演算回路128は、メッセージデータ保持回路125に書き込まれたK0 xor ipadに対してハッシュ演算を行うことにより、ダイジェストH(K0 xor ipad)を求める。また、ハッシュ演算回路128は、メッセージデータ保持回路125に書き込まれたK0 xor opadに対してハッシュ演算を行うことにより、ダイジェストH(K0 xor opad)を求める。
【００４６】
また、ハッシュ演算回路128は、HMACの中間値H((K0 xor ipad) || M)を求める。ここで、メッセージデータのデータ長(Length(M))が、ハッシュ関数のブロック長(Length(B))より長い場合には、メッセージデータMをn個のメッセージデータブロック（M0, M1, M2,…,Mn）に分割し、M0, M1, M2,…,Mn（若しくはＭnに0を連接したデータ）の順番でハッシュ演算回路１２８に入力し、ハッシュ演算を繰り返し行う。その結果、H((K0 xor ipad) ||M0, M1, M2,…,Mn)（＝H((K0 xor ipad) || M)）を求めることができる。
【００４７】
また、ハッシュ演算回路128は、H((K0 xor ipad) ||M)を求めている時に、メッセージデータMのn個のメッセージデータブロック（ M0, M1, M2,…,Mn）のうち、Miまで到着し、H((K0 xor ipad) ||M0, M1, M2,…,Mn)を求めるための次のデータMi＋1が到着する前に、別のメッセージデータＭ(M2とする。）及び秘密鍵K(K2とする。) のデータが揃った場合、H((K0 xor ipad) ||M)の中間結果H((K0 xor ipad) ||M0, M1, M2,…,Mi)をHMAC出力信号線130より出力し、記憶装置300のメッセージデータ記憶回路300bに記録しておく。記憶装置300のメッセージデータ記憶回路300bに記録したH((K0 xor ipad) || M0, M1, M2,…,Mi)）は、H((K0 xor ipad) ||M)の演算途中から演算を再開する場合に、中断再開ステップで、ハッシュ演算回路128に戻される。そのために、ハッシュ初期値入力信号線132に退避しておいたH((K0 xor ipad) || M0, M1, M2,…,Mi)）を入力し、かつ再開信号線127により再開信号を1とした信号をセレクタ１４１に入力することにより、H((K0 xor ipad) || M0, M1, M2,…,Mi)）はハッシュ演算回路128内にあるダイジェスト値記憶回路143に書き込まれる。
【００４８】
HMAC制御回路129のステートマシンは、HMAC演算回路100の状態遷移を管理する。
【００４９】
HMAC制御回路129にあるステートマシンは、HMAC演算回路100の外部よりHMAC信号線131と、再開信号線127と、秘密鍵・メッセージ指定信号線126により状態を制御することができる。
【００５０】
例えば、HMAC制御回路129に、HMAC信号を1クロックサイクル以上0にした信号を入力することで、HMAC制御回路129にあるステートマシンを初期状態へ遷移させることができる。
【００５１】
また、再開信号を1、秘密鍵・メッセージ指定信号を0とすることで、HMAC制御回路129にあるステートマシンの状態を秘密鍵のダイジェストの算出を再開する状態にすることができる。また、再開信号を1、秘密鍵・メッセージ指定信号を1とすることで、HMAC制御回路129にあるステートマシンは、H((K0 xor ipad) ||M)の算出を再開する状態に遷移する。
【００５２】
セレクタ140は、K書き込み信号線135により入力されるK書き込み信号が“1”である場合、記憶部300の秘密鍵データ記憶回路300aに退避しておいたデータKまたはH(K)を秘密鍵・メッセージ入力信号線119を通じてK保持回路124に出力し、K書き込み信号線135により入力されるK書き込み信号が“０”である場合、ハッシュ演算回路128の出力をK保持回路124に出力する。
【００５３】
セレクタ141は、再開信号線127により入力される再開信号が“1”である場合、ハッシュ初期値入力信号線127により入力された信号をハッシュ演算回路143に出力し、再開信号が“０”である場合、後述する定数回路142により入力された信号をハッシュ演算回路128に出力する。例えば、ハッシュ初期値入力信号線132にH(K０,K １, K ２, …, K i）を入力し、再開信号を１とすることにより、H (K)の途中結果H(K０,K １, K ２, …, K i）をハッシュ演算回路128に出力する。また、ハッシュ初期値入力信号線132にH((K0 xor ipad) || M0, M1, M2,…,Mi)）を入力し、再開信号を１とすることにより、H((K0 xor ipad) ||M)の途中結果H((K0 xor ipad) || M0, M1, M2,…,Mi)）をハッシュ演算回路128に出力する。
【００５４】
定数回路142は、ハッシュアルゴリズムで定められた初期値を出力する。再開信号“０”がセレクタ141に入力された場合に、定数回路142の出力はセレクタク141を通じて、セレクタ141からハッシュ演算回路128に入力される。ここで、初期値とは、ハッシュ演算回路128が、あるデータに対してダイジェストを求める際に、ハッシュ演算の初期値として用いる値である。
【００５５】
次に、図３に示す状態遷移グラフに従って、図２のHMAC演算回路100の処理について説明する。また、HMAC制御回路129の状態遷移についても併せて説明する。
【００５６】
まず、0にセットしたHMAC信号をHMAC信号線131によりHMAC制御回路１２９に入力する。0にセットしたHMAC信号が入力されると、HMAC制御回路１２９が管理するHMAC演算回路の状態は初期状態（Ｓ１０）となる。HMAC制御回路131により、HMAC演算回路100の状態が初期状態となる。
【００５７】
次に、1にセットしたHMAC信号をHMAC信号線131によりHMAC制御回路129に入力する。1にセットしたHMAC信号が入力されると、HMAC制御回路129が動作を開始する。
【００５８】
これからHMACを演算するために用いる秘密鍵のデータ長(秘密鍵長)(Length(K))を秘密鍵・メッセージ入力信号線118によりパディング回路121に入力する。パディング回路121は、入力されたLength(K)により、図3のステップＳ１１、ステップＳ１２、ステップＳ１３のいずれの処理を行うかを判断することができる。  
秘密鍵長(Length(K)の値によって、ステップS11、S12またはS13、S14A、S14Bの処理が行われる。これらの処理では、秘密鍵Kのデータを用いてハッシュ関数のブロック長(Length(B))と等しい長さのK0を生成し、さらに生成したK0に定数ｉｐａｄとの排他的論理和演算を行う。例えば、Length(K)＜Length(B)の場合には、秘密鍵長がハッシュ関数のブロック長より短いので、パディング処理、すなわちＢの長さになるまでＫの値に０を付加する処理（連接処理）を行う。一方、Length(K)＞Length(B)の場合には、秘密鍵長がブロック長より長いため、秘密鍵のハッシュ値H(K)を求め、このＨ（Ｋ）に対して上記パディング処理を行いK0とする。Length(K) とLength(B)が等しいときにはKは、そのままK0とする。
【００５９】
このようにして得られたブロック長と長さが等しいK0に、定数ｉｐａｄとの排他的論理和演算を行う。これらの具体的な処理を述べる。
【００６０】
＜（１）Length(K)＝Length(B)の場合；Ｓ１１＞
秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))と等しい場合には、パディング回路121は、ステップＳ１１の処理を行うと判断する。また、HMAC制御回路129の状態もステップＳ１１に遷移する。
【００６１】
パディング回路121は、秘密鍵・メッセージ入力信号線119を通じて入力された秘密鍵データKを鍵データK0として、K0に対して仕様で定められた定数ipadとの排他的論理和演算を行う。その演算結果をメッセージデータ保持回路125に書き込む。同時に、入力されたKをK保持回路124に書き込む。ここで、KをK保持回路124に書き込むことにより、図3のステップＳ１７における演算時に、秘密鍵データを再び入力する必要がなくなる。
【００６２】
Kとipadとの排他的論理和演算を完了すると、パディング回路１２１は、HMAC制御回路129に、Kとipadとの排他的論理和演算が完了した旨を通知する。HMAC制御回路129の状態は、Ｓ１５に遷移する。
【００６３】
＜（２）Length(K)＜Length(B)の場合；Ｓ１３＞
秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))よりも短いときには、パディング回路121は、ステップＳ１３の処理を行うと判断する。また、HMAC制御回路129の状態もＳ１３に遷移する。パディング回路121は、入力されたKに対してブロック長(Length(B))と等しくなるまで0で連接（パディング）し、鍵データK0を生成する。したがって、パディング回路121がパディングする0の個数は、ハッシュ関数のブロック長(Length(B))とパディング回路に入力されたLength(K)との差分により求めることができる。
【００６４】
なお、パディング回路121は、入力されたKをK保持回路124に書き込む。また、パディング回路121は、鍵データK0に対して仕様で定められた定数ipadとの排他的論理和演算を行い、その演算結果（K0 xor ipad）をメッセージデータ保持回路125に書き込む。K0とipadとの排他的論理和の演算を完了すると、パディング回路121は、HMAC制御回路129に、K0とipadとの排他的論理和演算が完了した旨を通知する。HMAC制御回路129の状態は、Ｓ１５に遷移する。
【００６５】
＜（３）Length(K)＞Length(B)の場合；Ｓ１２＞
秘密鍵長(Length(K))がハッシュ関数のブロック長(Length(B))より大きい場合は、パディング回路121は、ステップＳ１２の処理を行うと判断する。また、HMAC制御回路129の状態もＳ１２に遷移する。
【００６６】
この場合のように、Length(K)がLength(B)よりも長いときには、秘密鍵Kのハッシュ値(ダイジェスト値)(H(K))を求める。H(K)を求めるために、秘密鍵Kをn個のデータ（分割秘密鍵と称する。）（ K0, K1, K2,…,Kn）に分割し、K0, K1, K2,…,Knの順番でハッシュ演算回路１２８に入力し、ハッシュ演算を繰り返し行う。ここで、K0, K1, K2,…,Kn-1のデータ長はハッシュ関数のブロック長と等しく、Knのデータ長はハッシュ関数のブロック長以下となる。
【００６７】
まず、分割秘密鍵Ki (i=0,…,n)をK0から順番に秘密鍵・メッセージ入力信号線119を介してHMAC演算回路100へ入力する。入力されたKi はパディング回路121を通り、メッセージデータ保持回路125に書き込まれ、ハッシュ演算回路１２８へと入力される。Kiの入力が終わると自動的にハッシュ演算回路128を使ったハッシュ演算が行われる。この結果、Kiまでの入力が終わった時点でハッシュ演算回路128から出力されるダイジェスト値は、H（K0, K1, K2,…Ki）と表す。
【００６８】
ハッシュ演算回路128は、ダイジェスト値H（K0, K1, K2,…Ki）の算出を完了すると、算出を完了した旨を、インターフェース200に通知する。ハッシュ演算回路128は、次のデータKi＋1が入力されるまで待機する。以上の演算をK0〜Kn-1について繰り返し行う。以上の手順で、H（K0, K1, K2,…,Kn-1）を求めることができる。
【００６９】
次に、Knが入力されると、パディング回路121は秘密鍵・メッセージ演算処理長入力信号線118を通じて入力された秘密鍵のデータ長を元に、秘密鍵・メッセージ入力信号線119から入力されたKnに必要があれば0を連接してメッセージデータ保持回路125に書き込む。
【００７０】
メッセージデータ保持回路125へのデータの書き込みが終わると、そのことをHMAC制御回路129に通知する。HMAC制御回路129は、パディング回路121から0の連接およびメッセージデータ保持回路125へのデータの書き込みが終わった通知を受け取ると、ハッシュ演算回路１２８に対して演算を開始することを通知する。
【００７１】
以上の演算によってステップＳ１２のH(K)の処理が終了する。秘密鍵Kの最後のデータブロックKnの演算が終わると、秘密鍵Kのダイジェスト値H(K)（＝H（K0, K1, K2,…,Kn）を求めることができる。
【００７２】
尚、K0からKnのうちK0からKn-1までは、データのブロック長はLength(B)である。したがって、パディング回路125は入力されたKiに対して、0のパディング処理を行わない。したがって、この場合、K0からKn-1までを入力する間は秘密鍵・メッセージ演算処理長入力信号線118を通じて残りの秘密鍵のデータ長を入力しなくともよい。
【００７３】
一方、Knは、データのブロック長はLength(B)より小さい場合がある。この場合、KnをHMAC演算回路100に入力する前に、秘密鍵・メッセージ演算処理長入力信号線118を通じてKnの長さをパディング回路121に入力しなければならない。なぜなら、パディング回路121では、Length(Kn)とLength(B)が等しくなるまで0を連接するので、Knの長さが必要となるためである。
【００７４】
Length(Kn)とLength(B)が等しい場合には、パディング回路121では0を連接する必要がないために、0を秘密鍵・メッセージ演算処理長入力信号線118に入力する。
【００７５】
以上の演算によってステップＳ１２のH(K)の処理が終了する。ハッシュ演算回路１２８は、HMAC制御回路129に、H(K)の算出が完了した旨を通知する。HMAC制御回路129の状態は、Ｓ１４Ａに遷移する。
【００７６】
次に、S14Aにおいて、HMAC制御回路129はハッシュ演算回路128の演算結果H(K)を、セレクタ140を介してK保持回路124に書き込ませる。また、S14Bにおいて、演算結果H(K)をセレクタ120を介してパディング回路121に出力し、パディング回路121は、H(K)に0を連接し、鍵データK0を生成し、鍵データK0と定数ipadとの排他的論理和を行う。また、その演算結果（K0 xor ipad）を、セレクタ123を経由してメッセージデータ保持回路125に書き込む。K保持回路124およびメッセージデータ保持回路125への書き込みが終了すると、HMAC制御回路129は状態Ｓ１５に遷移する。
【００７７】
＜Ｓ１５〜Ｓ１６＞
上述のステップＳ１１からＳ１４Ａの処理により、秘密鍵のデータからK0を生成され、メッセージデータ保持回路125にK0 xor ipadが書き込まれた状態となる。
【００７８】
次に生成したK0 xor ipadを用いてH((K0 xor ipad) || M)の演算を行う。まず、HMAC制御回路129のステートマシンが状態S15に遷移することで、ハッシュ演算回路128を用いて、メッセージデータ保持回路125に書き込まれたK0 xor ipadに対してハッシュ演算を行うことにより、ダイジェストH(K0 xor ipad)を求める。
【００７９】
なお、ハッシュアルゴリズムによっては、ダイジェストを取る際にメッセージデータの拡張演算を行うことがある。この場合、メッセージデータ拡張回路122は、メッセージデータ保持回路125の出力に対して拡張演算を行い、演算結果を、セレクタ123を介してメッセージデータ保持回路125に出力する。メッセージデータ保持回路125は、メッセージデータ拡張演算回路122の演算結果を受け取ると、ハッシュ演算回路128からの要求に応じて保持しているデータを出力する。
【００８０】
ハッシュ演算回路128が、H(K0 xor ipad)を算出する演算を終了すると、ハッシュ演算回路128から図示していない信号線を通じてHMAC制御回路129にH(K0 xor ipad)を算出するハッシュ演算が終了したことを通知する。これにより、HMAC制御回路129のHMAC制御回路129のステートマシンはメッセージデータの演算待ち状態Ｓ１６となる。
【００８１】
次に、H((K0 xor ipad) || M)の演算を行うため、HMACを求めたいメッセージデータを秘密鍵・メッセージ入力信号線119を通じてHMAC演算回路100に入力しなければならない。以下にその手順を説明する。
【００８２】
まず、これから演算するメッセージデータのデータ長さ(Length(M))を秘密鍵・メッセージ長入力信号線118を用いて、パディング回路121に入力する。
【００８３】
メッセージデータをMとするとき、Length(B)≧Length(M)であれば、Length(M)を総メッセージデータ長入力信号線134と秘密鍵・メッセージ演算長入力信号線118によりパディング回路121に入力した後、メッセージデータを秘密鍵・メッセージ入力信号線119を通じてパディング回路121に入力する。パディング回路121は、メッセージデータが入力されると、Length(B)となるまででメッセージデータに0を連接してメッセージデータ保持回路125に0パディングしたデータを書き込む。
【００８４】
一方、Length(B)<Length(M)である場合には、Mをn個のメッセージデータブロックM0, M1, M2,…,Mnに分割して、先頭から順番に秘密鍵・メッセージ入力信号線119を通じて入力する。ここで、M0, M1, M2,…,Mn-1は、Length(B)と同じデータ長に分割する。Mnのデータ長はLength(B)以下の長さである。
【００８５】
Mi (i=0,…,n-1)の演算の際には、パディング回路121を用いて入力データに対する0の連接を行う必要がないため、秘密鍵・メッセージ演算長入力信号線118にメッセージ長を入力しなくてもよい。しかし、Mn のデータサイズが、Length(B)より小さい場合は、パディング回路121はMnに対して0パディング処理を行う必要があるため、パディング回路は、データMnの長さが必要がとなる。したがって、例えば、Mi まで演算している場合に、秘密鍵・メッセージ演算長入力信号線118を用いて、Mi+1 からMnまでのデータ長を入力する。Length(M)も同様に、Mnの演算を行う前までに総メッセージデータ長入力信号線134にセットする必要がある。
【００８６】
メッセージデータブロックMi がメッセージデータ保持回路125に入力されると、自働的にハッシュ演算回路128が演算を開始し、H(K0 xor ipad) ||  Mi ) (i=0,…,n)の結果が得られる。
【００８７】
すべてのメッセージデータブロックMi(i=0,…,n)の入力を終えると、図3のステップ16の演算が終わり、HMACの中間値H((K0 xor ipad) || M)が得られる。このH((K0 xor ipad) || M)の演算が終了することで、HMAC制御回路129のステートマシンは次の状態Ｓ１７に遷移する。以上で、図３のステップ１6までの演算が終わる。図３のＳ１７以降は、すでにHMAC回路17が保持しているデータを用いて演算を行うことができるため、外部からの入力データ待ちは発生しない。
【００８８】
＜Ｓ１７＞
HMAC制御回路129のステートマシンの状態Ｓ１７では、HMAC演算回路100はK0 xor opadの演算を行うため、HMAC演算回路100は、K保持回路124に保持されているKを読み出し、セレクタ120を介してパディング回路121に入力する。パディング回路は、K に対して0パディングを行い、Length(K0)がLength(B)となる鍵データK0を生成する。 また、パディング回路121では0パディングすると同時にK0 xor opadの演算を行い、演算結果をメッセージデータ保持回路125に書き込む。データの書き込みが終了すると、HMAC制御回路129のステートマシンは状態Ｓ１８に遷移する。
【００８９】
＜Ｓ１８＞
HMAC制御回路129のステートマシンの状態Ｓ１８では、Ｓ１６で算出した演算結果H((K0 xor ipad) || M)を、一旦ハッシュ演算回路128からセレクタ140を介してK保持回路124に書き込み、ハッシュ演算回路128の演算結果H((K0 xor ipad) || M)をK保持回路124へ退避させる。
【００９０】
H((K0 xor ipad) || M)のK保持回路124への退避が完了すると、HMAC制御回路129内のステートマシンが状態S１9 へ遷移する。
【００９１】
＜Ｓ１９＞
Ｓ１９では、H(K0 xor opad)の演算が行われる。すなわち、ハッシュ演算回路128を用いて、メッセージデータ保持回路125に書き込まれたK0 xor opadに対してハッシュ演算を行うことにより、ダイジェストH(K0 xor opad)を求める。
【００９２】
H(K0 xor opad)の演算が終了すると、HMAC制御回路129のステートマシンは状態Ｓ２０ へ遷移する。
【００９３】
＜Ｓ２０、Ｓ２１＞
Ｓ２０では、Ｓ１８でK保持回路124に退避したH(K0 xor ipad) || M)を、セレクタ120を介してパディング回路121に読み出す。そして、パディング回路121が、H(K0 xor ipad) || M)に対して0パディング処理を行い、メッセージデータ保持回路125へ書き込む。
【００９４】
この書き込みが終了すると、HMAC制御回路129のステートマシンは状態S21へ遷移し、H((K0 xor opad )|| H((K0 xor ipad) || M))の演算を開始する。この演算が終了すると、求めたい情報のHMAC値がHMAC出力信号線130に出力される。
【００９５】
＜データがネットワークで送られてくる場合の問題＞
以上のようなＳ１１からＳ２１の手順でHMAC演算回路100が演算を進めてゆく場合に、HMAC演算回路100が必要とするとき即時に、秘密鍵データとメッセージデータが入力されるならば問題はない。しかし、これらのデータがネットワーク経由で送られてくる場合に問題が起こり得る。
【００９６】
例えば、Ｓ１２で、秘密鍵KのダイジェストH(K)を生成のため演算を行っているとき、秘密鍵Kを分割した分割秘密鍵K0 からKｎのうち、K0 からKi まではネットワーク400経由で滞りなくデータが送信されてきたが、次のKi+1が到着しないということがあり得る。
【００９７】
この場合には、HMACの演算はKi+1の入力待ち状態となり、HMACの演算が中断したままとなる。あるシステムの中でHMACを1つしか利用しない場合には、次の秘密鍵データKi+1が到着するまで待つこともできる。しかし、HMACを複数必要とする場合、１つのHMACの処理だけでHMAC演算回路を占有するよりも、演算が可能となったデータから順次処理していくことによりシステム全体の処理時間は短くすることが可能となる。
【００９８】
HMACの演算において、データの待ち状態となる可能性のある場合は２つある。１つは、図3のステップＳ１２において秘密鍵Kがハッシュ関数のブロック長Bよりも長い場合である。もう１つは、ステップＳ１８においてメッセージデータがハッシュ関数のブロック長Bよりも長い場合である。それ以外の処理においては、演算に必要なデータはHMAC演算回路100に保持されているため、外部からのデータ入力待ちは発生しない。
【００９９】
なお、ステップ１２とステップ１８において、インターフェース200がデータの入力待ちとなることはインターフェース200が検知する。
【０１００】
＜データがネットワークで送られてくる場合の問題の解決＞
そこで、HMACを求める際にステップＳ１２とステップＳ１８の演算において、データの入力待ちとなった場合に、演算を再開する際に必要となる情報をHMAC演算回路100の内部で退避しておくか、あるいはHMAC演算回路100の外部の記憶部300で保持する構成とする。  これと共に、必要なデータが揃ったところでステップＳ１２またはステップＳ１８から再開できるように、HMAC演算回路100の内部又は外部の記憶部300に退避していたデータをセットするとともに、HMACの演算を制御するHMAC制御回路129のステートマシンの状態を、演算を中断した状態にセットすることができるような構成とする。これにより演算に必要なデータが揃ったものから順番にHMACの演算を進めていくことが可能となる。
【０１０１】
以上のような再開に必要な条件を満たすことができるようにするため、HMAC演算回路100には再開信号線27と秘密鍵・メッセージデータ指定信号線126を備えている。
【０１０２】
＜解決するための詳細＞
以下でこれらの信号線の説明を行う。まず、Ｓ１２で秘密鍵のデータ長(Length(K))がLength(B)よりも長い場合において、H(K)を求める際に、別のHMACの演算を行うため、一度中断し、再びH(K)を求める演算Ｓ１２を再開する手順について説明する。
【０１０３】
まず、Ｓ１２を中断する手順を説明する。秘密鍵K1のダイジェストH(K1)を求めている時に、分割秘密鍵（K0, K1, K2,…,Kn）のうち、Kiまで到着し、H(K1)を求めるための次のデータKi＋1が到着する前に、別の秘密鍵K2のデータが揃ったとする。この場合、HMAC演算回路100のHMAC出力信号線130にそれまでのH(K1)の中間結果（K0, K1, K2,…,Ki）が出力されている。そこで、HMAC出力信号線130により出力する信号の値を読み出して記憶装置300に記録しておくとともに、秘密鍵K1のダイジェストを求めるために必要な残りデータのバイト数を記憶装置300に記録しておく。
【０１０４】
そして、秘密鍵K2のダイジェストを求めるために、HMAC制御回路129にあるステートマシンを初期状態に戻しておく必要があるため、HMAC信号線131が出力するHMAC信号を1クロックサイクル以上の間0にし、再びHMAC信号を1にする。このHMAC信号を1クロックサイクル以上0にすることで、HMAC制御回路129にあるステートマシンを初期状態へ遷移させることができる。
【０１０５】
HMAC制御回路129にあるステートマシンを初期状態へ遷移させたのち、秘密鍵K2の演算を開始する。ここで、秘密鍵K2の演算を行うにあたり、秘密鍵K2のデータ長を入力するなどの手順は通常の演算と同様であることからここでの説明は省略し、秘密鍵K2およびメッセージデータM2を使ってHMACの演算を求めることができたとする。このメッセージデータM2のHMACが求まったところで、先に中断した秘密鍵K1のダイジェストを求めるための再開手順を以下で説明する。
【０１０６】
HMAC制御回路129にあるステートマシンの状態を秘密鍵のダイジェスト生成状態にするために、再開信号を1、秘密鍵・メッセージ指定信号を0とし、秘密鍵・メッセージ入力信号線119から秘密鍵K1の残りのデータを入力してHMAC演算回路100を起動する。再開信号を1、秘密鍵・メッセージ指定信号を0と入力すると、HMAC制御回路129にあるステートマシンを初期状態から、ステートマシンは状態Ｓ１２に遷移する。さらに、ハッシュアルゴリズムでは1つ前のブロックの演算結果を、つぎのブロックの演算の初期値として用いる。そのため、秘密鍵K1のダイジェストの演算途中から再開させるために、中断再開ステップで記憶装置300に記録されていた秘密鍵K1の途中結果H（K0, K1, K2,…,Ki）をハッシュ演算回路128に戻さなければならない。再開信号を1、秘密鍵・メッセージ指定信号を０として、ハッシュ初期値入力信号線132に、秘密鍵Ｋ1のダイジェストの途中経過H（K0, K1, K2,…,Ki）を入力する。このように再開信号を1として、セレクタ141に入力することで、ハッシュ初期値入力信号線132から入力された秘密鍵K1のダイジェストの途中経過H（K0, K1, K2,…,Ki）は、セレクタ141を経由して、ハッシュ演算回路128内にあるダイジェスト値記憶回路143に書き込まれる。さらに、残りの秘密鍵K1のデータ長が分かっているときには、秘密鍵・メッセージ長入力信号線118に秘密鍵K1の残りのデータ長を入力する。
【０１０７】
なお、これ以降、H(K1)が求まるまで、残りの分割秘密鍵（Ki＋1, K i＋2, K i＋3,…,Kn）を入力する。以降の処理において中断することがないならば、通常の処理と同じようにメッセージデータM1を入力することで秘密鍵K1を用いたHMACを得ることができる。
【０１０８】
次に秘密鍵K3、メッセージデータM3のHMACを求める際に、メッセージデータM3のH((K0 xor ipad) ||M3)を求めている時に、メッセージデータM3のn個のメッセージデータブロック（ M0, M1, M2,…,Mn）のうち、Miまで到着し、H((K0 xor ipad) ||M0, M1, M2,…,Mn)を求めるための次のデータMi＋1が到着する前に、秘密鍵K4、メッセージデータM4のHMACのデータが先に準備できたことから、先にそちらの演算を行った後、メッセージデータM3のH((K0 xor ipad) ||M3)の演算を再開する手順について説明する。
【０１０９】
秘密鍵K3、メッセージデータM3を用いたHMACの演算において、メッセージデータM3の演算が行われるまでの手順は通常処理と同じであるため省略する。メッセージデータM3を使ったダイジェストを求めている途中で、秘密鍵K4、メッセージデータM4の演算が先に実行することができたため、K保持回路124に保持されている値を、K出力信号線133を用いてK保持回路124から読み出し、記憶部300の秘密鍵データ記憶回路300aに記憶させる。さらに、メッセージデータM3のHMACの演算途中の値H((K0 xor ipad) ||M0, M1, M2,…,Mi)がHMAC出力信号線130に出力されているので、この値をメッセージデータ記憶回路300bに記録しておく。
【０１１０】
以上のように、再開時に必要な情報を読み出した後、HMAC信号を0にしてHMAC制御回路129にあるステートマシンの状態を初期状態に戻す。以降、秘密鍵K4、メッセージデータM4を使って通常の処理手順で演算を行うことでHMACを得ることができる。
【０１１１】
次に、秘密鍵K4、メッセージデータM4を使ったHMACの演算が終了した後で、秘密鍵K3、メッセージデータＭ3を使った演算を再開する方法について説明する。
【０１１２】
HMAC制御回路129にあるステートマシンの状態をメッセージデータのダイジェスト演算待ち状態とするために、再開信号を1、秘密鍵・メッセージ指定信号線126が出力する秘密鍵・メッセージ指定信号を1、HMAC信号を1とし、メッセージデータM3の残りのデータをHMAC演算回路100に入力する。再開信号を1、秘密鍵・メッセージ指定信号を1にすることにより、HMAC制御回路129にあるステートマシンは、メッセージデータの演算待ち状態Ｓ１６に遷移する。
【０１１３】
中断再開ステップにおいて、再開信号を1、秘密鍵・メッセージ指定信号を1にして、ハッシュ初期値入力信号線132に、メッセージデータ記憶回路300bに退避しておいたH((K0 xor ipad) || M0, M1, M2,…,Mi)の値を入力する。再開信号を1としてセレクタ141に入力することで、ハッシュ初期値入力信号線132から入力されたH((K0 xor ipad) || M0, M1, M2,…,Mi)は、セレクタ141を経由して、ハッシュ演算回路128内にあるダイジェスト値記憶回路143に書き込まれる。
【０１１４】
上記で示したように再開信号と秘密鍵・メッセージ指定信号を用いることで、中断時に退避していたデータH((K0 xor ipad) || M0, M1, M2,…,Mi)をハッシュ演算の初期値として与えることが可能となるため、ハッシュ演算を中断したところから再開することが可能となる。
【０１１５】
次に、メッセージデータM3で残っているデータ長を秘密鍵・メッセージ長入力信号線118に入力する。このとき、メッセージデータM3の残りのメッセージ長が不明の場合には最後のメッセージデータブロックをHMAC演算回路100に入力する前までに、メッセージデータM3の残りメッセージデータ長を入力すればよい。さらに、メッセージデータM3のデータ長を総メッセージ長入力信号線133に入力する。
【０１１６】
さらに、K書き込み信号線135が出力するK書き込み信号を1にして、秘密鍵・メッセージ入力信号線119から記憶部300に退避しておいたKまたはH(K)を入力する。K書き込み信号線135により入力されるK書き込み信号が1になったとき、セレクタ140は、秘密鍵・メッセージ入力信号線119から入力されたデータをK保持回路124に送る。また、秘密鍵・メッセージ演算長入力信号線134に、メッセージデータM3の残りのメッセージ長を入力し、総メッセージ長入力信号線134に、メッセージデータM3のメッセージ長を入力する。
【０１１７】
以上で、再開に必要なデータのHMAC演算回路100への準備が終わる。後は、メッセージデータM3の残りのデータ（ Mi＋１, Mi＋2, Mi＋3,…,Mn）をHMAC演算回路１００に入力することで、秘密鍵K3、メッセージデータK3のHMACを求めることができる。
【０１１８】
このようにして、本発明のこの実施例によれば、ネットワークを介してデータを受ける場合にも、効率的にHMACを得ることが可能となる。
【０１１９】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【符号の説明】
【０１２０】
100・・・HMAC演算回路、
200・・・インターフェース、
300・・・記憶部、
400・・・ネットワーク、
500,600,1000・・・通信装置、
118・・・秘密鍵・メッセージ長入力信号線、
119・・・秘密鍵・メッセージ入力信号線、
120,123,140,141・・・セレクタ、
121・・・パディング回路、
122・・・メッセージデータ拡張回路、
124・・・K保持回路、
125・・・メッセージ保持回路、
126・・・秘密鍵・メッセージ指定信号線、
127・・・再開信号線、
128・・・ハッシュ演算回路、
129・・・HMAC制御回路、
130・・・HMAC出力信号線、
131・・・HMAC信号線、
132・・・ハッシュ初期値入力信号線、
133・・・K出力信号線、
134・・・総メッセージ長入力信号線、
135・・・K書き込み信号線、
142・・・定数回路、
143・・・ダイジェスト値記憶回路、
300a・・・秘密鍵データ記憶回路、
300b・・・メッセージデータ記憶回路。
【図１】
2011254440.tif 000003
【図２】
2011254440.tif 000004
【図３】
2011254440.tif 000005
【図４】
2011254440.tif 000006