ネットワーク WG
Request for Comments: 2286
分類: 情報提供
J. Kapp
Reaper Technologies
1998年2月

English

HMAC-RIPEMD160とHMAC-RIPEMD128のためのテストケース
(Test Cases for HMAC-RIPEMD160 and HMAC-RIPEMD128)

このメモの位置付け

このメモは、インターネット・コミュニティに対して情報提供を行うものです。 いかなる種類のインターネット標準も、このメモでは指定していません。 このメモの配布に制限はありません。

著作権表記

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の実装の仕様適合試験に使用されることを意図しています。

1. はじめに

ある特定のハッシュ関数を使用して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]にあります。

2. HMAC-RIPEMD160 のためのテストケース

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
    

3. HMAC-RIPEMD128 のためのテストケース

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
    

4. セキュリティについての考慮事項

本書では、セキュリティに関する問題は引き起こされません。 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はすべての保証を明示的にも暗黙的にもおこなわない。 その中には、この情報がいかなる権利も侵害していないという保証や、 商用利用および特定目的における適合性への保証が含まれる。