ネットワーク WG Request for Comments: 2286 分類: 情報提供 |
J. Kapp Reaper Technologies 1998年2月 |
このメモは、インターネット・コミュニティに対して情報提供を行うものです。 いかなる種類のインターネット標準も、このメモでは指定していません。 このメモの配布に制限はありません。
Copyright (C) The Internet Society (1998). All Rights Reserved.
この文書では、 HMAC-RIPEMD160とHMAC-RIPEMD128それぞれに対する2セットのテストケースを提供します。 HMAC-RIPEMD160とHMAC-RIPEMD128は、 RIPEMD-160ハッシュ関数とRIPEMD-128ハッシュ関数 [RIPE]を使用して構成されたHMAC [HMAC]メッセージ認証関数です。 この文書で提供されるテストケースとその結果は、 HMAC-RIPEMD160とHMAC-RIPEMD128の実装の仕様適合試験に使用されることを意図しています。
ある特定のハッシュ関数を使用してHMACメッセージ認証関数を構成する一般的な方法については、 [HMAC] の2章に記述されています。
2章と3章では、 HMAC-RIPEMD160とHMAC-RIPEMD128それぞれに対するテストケースを提供します。 各ケースには、鍵、データ、そしてその結果が含まれています。 鍵およびデータの値は、 16進数(「0x」で始まる)またはダブルコーテーション付きのASCII文字のどちらかで表示されています。 値がASCII文字である場合には、 そのテストケースに対するHMAC計算には、 文字中の最後のNULL文字(「\0」)は含まれません。
HMAC-RIPEMD160とHMAC-RIPEMD128の結果を生成する関数のCのソースコードを付録に収めてあります。 ここで、 これらの関数はシンプルで理解しやすいものを意図していることに注意してください。 これらは、全く最適化されていません。 HMAC-MD5を計算するCのソースコードは、 [MD5]にあります。
test_case = 1 key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b key_len = 20 data = "Hi There" data_len = 8 digest = 0x24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668 test_case = 2 key = "Jefe" key_len = 4 data = "what do ya want for nothing?" data_len = 28 digest = 0xdda6c0213a485a9e24f4742064a7f033b43c4069 test_case = 3 key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa key_len = 20 data = 0xdd を 50 回繰り返す data_len = 50 digest = 0xb0b105360de759960ab4f35298e116e295d8e7c1 test_case = 4 key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 key_len = 25 data = 0xcd を 50 回繰り返す data_len = 50 digest = 0xd5ca862f4d21d5e610e18b4cf1beb97a4365ecf4 test_case = 5 key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c key_len = 20 data = "Test With Truncation" data_len = 20 digest = 0x7619693978f91d90539ae786500ff3d8e0518e39 digest-96 = 0x7619693978f91d90539ae786 test_case = 6 key = 0xaa を 80 回繰り返す key_len = 80 data = "Test Using Larger Than Block-Size Key - Hash Key First" data_len = 54 digest = 0x6466ca07ac5eac29e1bd523e5ada7605b791fd8b test_case = 7 key = 0xaa を 80 回繰り返す key_len = 80 data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" data_len = 73 digest = 0x69ea60798d71616cce5fd0871e23754cd75d5a0a
test_case = 1 key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b key_len = 16 data = "Hi There" data_len = 8 digest = 0xfbf61f9492aa4bbf81c172e84e0734db test_case = 2 key = "Jefe" key_len = 4 data = "what do ya want for nothing?" data_len = 28 digest = 0x875f828862b6b334b427c55f9f7ff09b test_case = 3 key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa key_len = 16 data = 0xdd を 50 回繰り返す data_len = 50 digest = 0x09f0b2846d2f543da363cbec8d62a38d test_case = 4 key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 key_len = 25 data = 0xcd repeated 50 times data_len = 50 digest = 0xbdbbd7cf03e44b5aa60af815be4d2294 test_case = 5 key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c key_len = 16 data = "Test With Truncation" data_len = 20 digest = 0xe79808f24b25fd031c155f0d551d9a3a digest-96 = 0xe79808f24b25fd031c155f0d test_case = 6 key = 0xaa を 80 回繰り返す key_len = 80 data = "Test Using Larger Than Block-Size Key - Hash Key First" data_len = 54 digest = 0xdc732928de98104a1f59d373c150acbb test_case = 7 key = 0xaa を 80 回繰り返す key_len = 80 data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" data_len = 73 digest = 0x5c6bec96793e16d40690c237635f30c5
本書では、セキュリティに関する問題は引き起こされません。 HMAC構成の強度に関する議論は、[HMAC] にあります。
[HMAC] Krawczyk, H., Bellare, M., and R. Canetti,
「HMAC: メッセージ認証のための鍵付ハッシング(HMAC:
Keyed-Hashing for Message Authentication)」,
RFC 2104, 1997年2月.
[MD5] Rivest, R.,
「MD5 メッセージダイジェストアルゴリズム(The MD5 Message-Digest
Algorithm)」,
RFC 1321(English), 1992年4月.
[OG] Oehler, M., and R. Glenn,
「HMAC-MD5 リプレイ防止機能付き IP 認証(HMAC-MD5 IP Authentication
with Replay Prevention)」,
RFC 2085, 1997年2月.
[CG] Chang, S., and R. Glenn,
「HMAC-MD5 と HMAC-SHA-1 のためのテストケース(Test Cases for
HMAC-MD5 and HMAC-SHA-1)」,
RFC 2202, 1997年9月.
[RIPE] Dobbertin, H., Bosselaers A., and Preneel, B. "RIPEMD-160: A Strengthened Version of RIPEMD" 1996年4月
Justin S. Kapp
Reaper Technologies
The Post Office, Dunsop Bridge
Clitheroe, Lancashire.
BB7 3BB. United Kingdom
EMail: skapp@reapertech.com
東京都中央区新川1-21-2 茅場町タワー
株式会社 NTTデータ
開発本部
馬場 達也
EMail: baba@rd.nttdata.co.jp
これは、既存のRIPEMD-160ライブラリを使用してHMAC-RIPEMD160を実装するためのコードです。 ここでは、RIPEMD-160ライブラリが、 RFC 1321に記述されているMD5コードのようなAPIを持っていると仮定しています。 HMAC-MD5用のコードも、これと似ており、そのHMAC-MD5コードは、 RFC 2104 に掲載されています。 この例からHMAC-RIPEMD128を生成するためには、 「RMD160」という文字列を「RMD128」に置き換えて下さい。
#ifndef RMD160_DIGESTSIZE #define RMD160_DIGESTSIZE 20 #endif #ifndef RMD128_DIGESTSIZE #define RMD128_DIGESTSIZE 16 #endif /* HMAC_RMD160 implements HMAC-RIPEMD160 */ void HMAC_RMD160(input, len, key, keylen, digest) unsigned char *input; /* pointer to data stream */ int len; /* length of data stream */ unsigned char *key; /* pointer to authentication key */ int keylen; /* length of authentication key */ unsigned char *digest; /* resulting MAC digest */ { RMD160_CTX context; unsigned char k_ipad[65]; /* inner padding - key XORd with ipad */ unsigned char k_opad[65]; /* outer padding - key XORd with opad */ unsigned char tk[RMD160_DIGESTSIZE]; int i; /* if key is longer than 64 bytes reset it to key=SHA1(key) */ if (keylen > 64) { RMD160_CTX tctx; RMD160Init(&tctx); RMD160Update(&tctx, key, keylen); RMD160Final(tk, &tctx); key = tk; keylen = RMD160_DIGESTSIZE; } /* The HMAC_SHA1 transform looks like: RMD160(K XOR opad, RMD160(K XOR ipad, text)) where K is an n byte key ipad is the byte 0x36 repeated 64 times opad is the byte 0x5c repeated 64 times and text is the data being protected */ /* start out by storing key in pads */ memset(k_ipad, 0x36, sizeof(k_ipad)); memset(k_opad, 0x5c, sizeof(k_opad)); /* XOR key with ipad and opad values */ for (i=0; i<keylen; i++) { k_ipad[i] ^= key[i]; k_opad[i] ^= key[i]; } /* perform inner RIPEMD-160 */ RMD160Init(&context); /* init context for 1st pass */ RMD160Update(&context, k_ipad, 64); /* start with inner pad */ RMD160Update(&context, input, len); /* then text of datagram */ RMD160Final(digest, &context); /* finish up 1st pass */ /* perform outer RIPEMD-160 */ RMD160Init(&context); /* init context for 2nd pass */ RMD160Update(&context, k_opad, 64); /* start with outer pad */ /* then results of 1st hash */ RMD160Update(&context, digest, RMD160_DIGESTSIZE); RMD160Final(digest, &context); /* finish up 2nd pass */ memset(k_ipad, 0x00, sizeof(k_ipad)); memset(k_opad, 0x00, sizeof(k_opad)); }
Copyright (C) The Internet Society (1998). All Rights Reserved.
本文書とその翻訳は、複製および他に提供することができる。 また、この文書に論評や説明を加えたり、その実装を補助するものは、 上記の著作権表示およびこの節を付加していれば、 全体あるいは一部であっても一切の制約を課されることなく作成、複製、 発表、配布できる。 ただし、この文書自体に対して、 著作権表示やインターネット・ソサエティもしくは他のインターネット関連団体への参照を取り除くなどの変更を加えてはならない。 インターネット標準化過程で定義されている著作権のための手続きに従って、 インターネット標準を開発するために必要な場合や、 RFCを英語以外の言語に翻訳する必要がある場合はそのかぎりでない。
上記の制限は永続的なものであり、 インターネット・ソサエティもしくはその継承者や譲渡者によって取り消されることはない。
本文書とここに含まれた情報は「無保証」で提供され、 インターネット・ソサエティおよびIETFはすべての保証を明示的にも暗黙的にもおこなわない。 その中には、この情報がいかなる権利も侵害していないという保証や、 商用利用および特定目的における適合性への保証が含まれる。