00001 /* md5.h - Declaration of functions and data types used for MD5 sum 00002 computing library functions. 00003 Copyright 1995, 1996, 2000 Free Software Foundation, Inc. 00004 NOTE: The canonical source of this file is maintained with the GNU C 00005 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. 00006 00007 This program is free software; you can redistribute it and/or modify it 00008 under the terms of the GNU General Public License as published by the 00009 Free Software Foundation; either version 2, or (at your option) any 00010 later version. 00011 00012 This program is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with this program; if not, write to the Free Software Foundation, 00019 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 00020 00021 #ifndef _MD5_H 00022 #define _MD5_H 1 00023 00024 #include <stdio.h> 00025 00026 #if defined HAVE_LIMITS_H || _LIBC 00027 # include <limits.h> 00028 #endif 00029 00030 /* The following contortions are an attempt to use the C preprocessor 00031 to determine an unsigned integral type that is 32 bits wide. An 00032 alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but 00033 doing that would require that the configure script compile and *run* 00034 the resulting executable. Locally running cross-compiled executables 00035 is usually not possible. */ 00036 00037 #ifdef _LIBC 00038 # include <sys/types.h> 00039 typedef u_int32_t md5_uint32; 00040 #else 00041 # define INT_MAX_32_BITS 2147483647 00042 00043 /* If UINT_MAX isn't defined, assume it's a 32-bit type. 00044 This should be valid for all systems GNU cares about because 00045 that doesn't include 16-bit systems, and only modern systems 00046 (that certainly have <limits.h>) have 64+-bit integral types. */ 00047 00048 # ifndef INT_MAX 00049 # define INT_MAX INT_MAX_32_BITS 00050 # endif 00051 00052 # if INT_MAX == INT_MAX_32_BITS 00053 typedef unsigned int md5_uint32; 00054 # else 00055 # if SHRT_MAX == INT_MAX_32_BITS 00056 typedef unsigned short md5_uint32; 00057 # else 00058 # if LONG_MAX == INT_MAX_32_BITS 00059 typedef unsigned long md5_uint32; 00060 # else 00061 /* The following line is intended to evoke an error. 00062 Using #error is not portable enough. */ 00063 "Cannot determine unsigned 32-bit data type." 00064 # endif 00065 # endif 00066 # endif 00067 #endif 00068 00069 #undef __P 00070 #if defined (__STDC__) && __STDC__ 00071 #define __P(x) x 00072 #else 00073 #define __P(x) () 00074 #endif 00075 00076 /* Structure to save state of computation between the single steps. */ 00077 struct md5_ctx 00078 { 00079 md5_uint32 A; 00080 md5_uint32 B; 00081 md5_uint32 C; 00082 md5_uint32 D; 00083 00084 md5_uint32 total[2]; 00085 md5_uint32 buflen; 00086 char buffer[128]; 00087 }; 00088 00089 /* 00090 * The following three functions are build up the low level used in 00091 * the functions `md5_stream' and `md5_buffer'. 00092 */ 00093 00094 /* Initialize structure containing state of computation. 00095 (RFC 1321, 3.3: Step 3) */ 00096 extern void md5_init_ctx __P ((struct md5_ctx *ctx)); 00097 00098 /* Starting with the result of former calls of this function (or the 00099 initialization function update the context for the next LEN bytes 00100 starting at BUFFER. 00101 It is necessary that LEN is a multiple of 64!!! */ 00102 extern void md5_process_block __P ((const void *buffer, size_t len, 00103 struct md5_ctx *ctx)); 00104 00105 /* Starting with the result of former calls of this function (or the 00106 initialization function update the context for the next LEN bytes 00107 starting at BUFFER. 00108 It is NOT required that LEN is a multiple of 64. */ 00109 extern void md5_process_bytes __P ((const void *buffer, size_t len, 00110 struct md5_ctx *ctx)); 00111 00112 /* Process the remaining bytes in the buffer and put result from CTX 00113 in first 16 bytes following RESBUF. The result is always in little 00114 endian byte order, so that a byte-wise output yields to the wanted 00115 ASCII representation of the message digest. 00116 00117 IMPORTANT: On some systems it is required that RESBUF is correctly 00118 aligned for a 32 bits value. */ 00119 extern void *md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf)); 00120 00121 00122 /* Put result from CTX in first 16 bytes following RESBUF. The result is 00123 always in little endian byte order, so that a byte-wise output yields 00124 to the wanted ASCII representation of the message digest. 00125 00126 IMPORTANT: On some systems it is required that RESBUF is correctly 00127 aligned for a 32 bits value. */ 00128 extern void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf)); 00129 00130 00131 /* Compute MD5 message digest for bytes read from STREAM. The 00132 resulting message digest number will be written into the 16 bytes 00133 beginning at RESBLOCK. */ 00134 extern int md5_stream __P ((FILE *stream, void *resblock)); 00135 00136 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The 00137 result is always in little endian byte order, so that a byte-wise 00138 output yields to the wanted ASCII representation of the message 00139 digest. */ 00140 extern void *md5_buffer __P ((const char *buffer, size_t len, void *resblock)); 00141 00142 #endif
1.5.6