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