Appendix A - Reference Implementation (Anhang A - Referenzimplementierung)
Dieser Anhang enthält die folgenden Dateien aus RSAREF: A Cryptographic Toolkit for Privacy-Enhanced Mail:
global.h-- globale Header-Dateimd5.h-- Header-Datei für MD5md5c.c-- Quellcode für MD5
Für weitere Informationen über RSAREF senden Sie eine E-Mail an <[email protected]>.
Der Anhang enthält auch die folgende Datei:
mddriver.c-- Testtreiber für MD2, MD4 und MD5
Der Treiber kompiliert standardmäßig für MD5, kann aber für MD2 oder MD4 kompilieren, wenn das Symbol MD auf der C-Compiler-Befehlszeile als 2 oder 4 definiert ist.
Die Implementierung ist portabel und sollte auf vielen verschiedenen Plattformen funktionieren. Es ist jedoch nicht schwierig, die Implementierung auf bestimmten Plattformen zu optimieren, eine Übung, die dem Leser überlassen bleibt. Zum Beispiel können auf „Little-Endian"-Plattformen, bei denen das niedrigst adressierte Byte in einem 32-Bit-Wort das am wenigsten signifikante ist und keine Ausrichtungsbeschränkungen bestehen, der Aufruf von Decode in MD5Transform durch einen Typecast ersetzt werden.
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. [Copyright-Hinweis identisch mit md5.h] */
/* 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 */
/* [Vollständiger C-Implementierungscode aus Platzgründen weggelassen.
Für die vollständige Implementierung siehe den offiziellen RFC 1321-Text.] */
A.4 mddriver.c
Das Testtreiberprogramm mddriver.c bietet Dienstprogramme zum Testen von MD5:
- String-Digest
- Datei-Digest
- Zeitversuche
- Ausführung der Testsuite
A.5 Test suite (Testsuite)
Die MD5-Testsuite (Treiberoption "-x") sollte die folgenden Ergebnisse ausgeben:
MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a