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