メインコンテンツまでスキップ

Appendix A - Reference Implementation (付録A - 参照実装)

この付録には、RSAREF: A Cryptographic Toolkit for Privacy-Enhanced Mailから取得した次のファイルが含まれています。

  • global.h -- グローバルヘッダーファイル
  • md5.h -- MD5のヘッダーファイル
  • md5c.c -- MD5のソースコード

RSAREFの詳細については、<[email protected]>に電子メールを送信してください。

付録には次のファイルも含まれています。

  • mddriver.c -- MD2、MD4、MD5のテストドライバ

このドライバはデフォルトでMD5用にコンパイルされますが、Cコンパイラのコマンドラインでシンボルを2または4としてMDに定義すると、MD2またはMD4用にコンパイルできます。

この実装は移植可能で、多くの異なるプラットフォームで動作するはずです。ただし、特定のプラットフォームで実装を最適化することは難しくありません。これは読者への演習として残されています。たとえば、32ビットワードの最下位バイトが最も重要でないバイトであり、アライメントの制限がない「リトルエンディアン」プラットフォームでは、MD5TransformのDecodeへの呼び出しをtypecastに置き換えることができます。

A.1 global.h

/* GLOBAL.H - RSAREF types and constants */

/* PROTOTYPES should be set to one if and only if the compiler supports
function argument prototyping. The following makes PROTOTYPES default
to 0 if it has not already been defined with C compiler flags. */
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;

/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;

/* UINT4 defines a four byte word */
typedef unsigned long int UINT4;

/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
returns an empty list. */
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

A.2 md5.h

/* MD5.H - header file for MD5C.C */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved. [著作権表示は英語のまま保持] */

/* MD5 context. */
typedef struct {
UINT4 state[4]; /* state (ABCD) */
UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
unsigned char buffer[64]; /* input buffer */
} MD5_CTX;

void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST
((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));

A.3 md5c.c

/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */

/* [完全なC実装コードはスペースの都合上省略されています。
完全な実装については、RFC 1321の公式テキストを参照してください。] */

A.4 mddriver.c

テストドライバプログラムmddriver.cは、MD5をテストするためのユーティリティを提供します。

  • 文字列のダイジェスト
  • ファイルのダイジェスト
  • 時間試験
  • テストスイートの実行

A.5 Test suite (テストスイート)

MD5テストスイート (ドライバオプション"-x") は、次の結果を出力するべきです。

MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a