1 /* md5.h - Declaration of functions and data types used for MD5 sum
2 computing library functions.
3 Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc.
4 NOTE: The canonical source of this file is maintained with the GNU C
5 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
6
7 This program is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifndef R_MD5_H
23 #define R_MD5_H 1
24
25 #include <stdio.h>
26
27 #if defined HAVE_LIMITS_H || _LIBC
28 # include <limits.h>
29 #endif
30
31 /* The following contortions are an attempt to use the C preprocessor
32 to determine an unsigned integral type that is 32 bits wide. An
33 alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
34 doing that would require that the configure script compile and *run*
35 the resulting executable. Locally running cross-compiled executables
36 is usually not possible. */
37
38 #ifdef _LIBC
39 # include <sys/types.h>
40 typedef u_int32_t md5_uint32;
41 #else
42 # if defined __STDC__ && __STDC__
43 # define UINT_MAX_32_BITS 4294967295U
44 # else
45 # define UINT_MAX_32_BITS 0xFFFFFFFF
46 # endif
47
48 /* If UINT_MAX isn't defined, assume it's a 32-bit type.
49 This should be valid for all systems GNU cares about because
50 that doesn't include 16-bit systems, and only modern systems
51 (that certainly have <limits.h>) have 64+-bit integral types. */
52
53 # ifndef UINT_MAX
54 # define UINT_MAX UINT_MAX_32_BITS
55 # endif
56
57 # if UINT_MAX == UINT_MAX_32_BITS
58 typedef unsigned int md5_uint32;
59 # else
60 # if USHRT_MAX == UINT_MAX_32_BITS
61 typedef unsigned short md5_uint32;
62 # else
63 # if ULONG_MAX == UINT_MAX_32_BITS
64 typedef unsigned long md5_uint32;
65 # else
66 /* The following line is intended to evoke an error.
67 Using #error is not portable enough. */
68 "Cannot determine unsigned 32-bit data type."
69 # endif
70 # endif
71 # endif
72 #endif
73
74 #undef __P
75 #if defined (__STDC__) && __STDC__
76 #define __P(x) x
77 #else
78 #define __P(x) ()
79 #endif
80
81 /* Structure to save state of computation between the single steps. */
82 struct md5_ctx
83 {
84 md5_uint32 A;
85 md5_uint32 B;
86 md5_uint32 C;
87 md5_uint32 D;
88
89 md5_uint32 total[2];
90 md5_uint32 buflen;
91 char buffer[128];
92 };
93
94 /*
95 * The following three functions are build up the low level used in
96 * the functions `md5_stream' and `md5_buffer'.
97 */
98
99 /* Compute MD5 message digest for bytes read from STREAM. The
100 resulting message digest number will be written into the 16 bytes
101 beginning at RESBLOCK. */
102 extern int md5_stream __P ((FILE *stream, void *resblock));
103
104 #ifndef ROL_UNUSED
105 /* The following is from gnupg-1.0.2's cipher/bithelp.h. */
106 /* Rotate a 32 bit integer by n bytes */
107 #if defined __GNUC__ && defined __i386__
108 static md5_uint32
rol(md5_uint32 x,int n)109 rol(md5_uint32 x, int n)
110 {
111 __asm__("roll %%cl,%0"
112 :"=r" (x)
113 :"0" (x),"c" (n));
114 return x;
115 }
116 #else
117 # define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
118 #endif
119 #endif
120
121 #endif /* R_MD5_H */
122