| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | /* Declaration of functions and data types used for MD5 sum computing
 | 
					
						
							|  |  |  |    library functions. | 
					
						
							|  |  |  |    Copyright (C) 1995,1996,1997,1999,2000,2001 Free Software Foundation, Inc. | 
					
						
							|  |  |  |    This file is part of the GNU C Library. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |    modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |    License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |    version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |    Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |    You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2021-02-12 08:41:38 +00:00
										 |  |  |    License along with the GNU C Library. | 
					
						
							|  |  |  |    If not, see <https://www.gnu.org/licenses/>.  */
 | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef _MD5_H
 | 
					
						
							|  |  |  | #define _MD5_H 1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined HAVE_LIMITS_H || _LIBC
 | 
					
						
							|  |  |  | # include <limits.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The following contortions are an attempt to use the C preprocessor
 | 
					
						
							|  |  |  |    to determine an unsigned integral type that is 32 bits wide.  An | 
					
						
							|  |  |  |    alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but | 
					
						
							|  |  |  |    doing that would require that the configure script compile and *run* | 
					
						
							|  |  |  |    the resulting executable.  Locally running cross-compiled executables | 
					
						
							|  |  |  |    is usually not possible.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _LIBC
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | # include <stdint.h>
 | 
					
						
							|  |  |  | typedef uint32_t md5_uint32; | 
					
						
							|  |  |  | typedef uintptr_t md5_uintptr; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | # if defined __STDC__ && __STDC__
 | 
					
						
							|  |  |  | #  define UINT_MAX_32_BITS 4294967295U
 | 
					
						
							|  |  |  | # else
 | 
					
						
							|  |  |  | #  define UINT_MAX_32_BITS 0xFFFFFFFF
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* If UINT_MAX isn't defined, assume it's a 32-bit type.
 | 
					
						
							|  |  |  |    This should be valid for all systems GNU cares about because | 
					
						
							|  |  |  |    that doesn't include 16-bit systems, and only modern systems | 
					
						
							|  |  |  |    (that certainly have <limits.h>) have 64+-bit integral types.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ifndef UINT_MAX
 | 
					
						
							|  |  |  | #  define UINT_MAX UINT_MAX_32_BITS
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # if UINT_MAX == UINT_MAX_32_BITS
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |    typedef unsigned int md5_uint32; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | # else
 | 
					
						
							|  |  |  | #  if USHRT_MAX == UINT_MAX_32_BITS
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |     typedef unsigned short md5_uint32; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #  else
 | 
					
						
							|  |  |  | #   if ULONG_MAX == UINT_MAX_32_BITS
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |      typedef unsigned long md5_uint32; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #   else
 | 
					
						
							|  |  |  |      /* The following line is intended to evoke an error.
 | 
					
						
							|  |  |  |         Using #error is not portable enough.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |      "Cannot determine unsigned 32-bit data type." | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #   endif
 | 
					
						
							|  |  |  | #  endif
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | /* We have to make a guess about the integer type equivalent in size
 | 
					
						
							|  |  |  |    to pointers which should always be correct.  */ | 
					
						
							|  |  |  | typedef unsigned long int md5_uintptr; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #undef __P
 | 
					
						
							|  |  |  | #if defined (__STDC__) && __STDC__
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | # define __P(x) x
 | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | # define __P(x) ()
 | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-02 22:13:20 +00:00
										 |  |  | #define __md5_buffer md5_buffer
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-03 20:39:43 +00:00
										 |  |  | #if defined __GNUC__
 | 
					
						
							|  |  |  | #define ALIGN __attribute__ ((__aligned__ (4)))
 | 
					
						
							| 
									
										
										
										
											2003-04-15 14:51:34 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define ALIGN
 | 
					
						
							| 
									
										
										
										
											2017-05-27 05:27:22 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2003-04-15 14:51:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | /* Structure to save state of computation between the single steps.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | struct md5_ctx | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   md5_uint32 A; | 
					
						
							|  |  |  |   md5_uint32 B; | 
					
						
							|  |  |  |   md5_uint32 C; | 
					
						
							|  |  |  |   md5_uint32 D; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   md5_uint32 total[2]; | 
					
						
							|  |  |  |   md5_uint32 buflen; | 
					
						
							| 
									
										
										
										
											2003-04-15 14:51:34 +00:00
										 |  |  |   char buffer[128] ALIGN; | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * The following three functions are build up the low level used in | 
					
						
							|  |  |  |  * the functions `md5_stream' and `md5_buffer'. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Initialize structure containing state of computation.
 | 
					
						
							|  |  |  |    (RFC 1321, 3.3: Step 3)  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void __md5_init_ctx __P ((struct md5_ctx *ctx)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Starting with the result of former calls of this function (or the
 | 
					
						
							|  |  |  |    initialization function update the context for the next LEN bytes | 
					
						
							|  |  |  |    starting at BUFFER. | 
					
						
							|  |  |  |    It is necessary that LEN is a multiple of 64!!! */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void __md5_process_block __P ((const void *buffer, size_t len, | 
					
						
							|  |  |  | 				      struct md5_ctx *ctx)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Starting with the result of former calls of this function (or the
 | 
					
						
							|  |  |  |    initialization function update the context for the next LEN bytes | 
					
						
							|  |  |  |    starting at BUFFER. | 
					
						
							|  |  |  |    It is NOT required that LEN is a multiple of 64.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void __md5_process_bytes __P ((const void *buffer, size_t len, | 
					
						
							|  |  |  | 				      struct md5_ctx *ctx)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Process the remaining bytes in the buffer and put result from CTX
 | 
					
						
							|  |  |  |    in first 16 bytes following RESBUF.  The result is always in little | 
					
						
							|  |  |  |    endian byte order, so that a byte-wise output yields to the wanted | 
					
						
							|  |  |  |    ASCII representation of the message digest. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  |    IMPORTANT: On some systems it is required that RESBUF is correctly | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  |    aligned for a 32 bits value.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void *__md5_finish_ctx __P ((struct md5_ctx *ctx, void *resbuf)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Put result from CTX in first 16 bytes following RESBUF.  The result is
 | 
					
						
							|  |  |  |    always in little endian byte order, so that a byte-wise output yields | 
					
						
							|  |  |  |    to the wanted ASCII representation of the message digest. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    IMPORTANT: On some systems it is required that RESBUF is correctly | 
					
						
							|  |  |  |    aligned for a 32 bits value.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void *__md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Compute MD5 message digest for bytes read from STREAM.  The
 | 
					
						
							|  |  |  |    resulting message digest number will be written into the 16 bytes | 
					
						
							|  |  |  |    beginning at RESBLOCK.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern int __md5_stream __P ((FILE *stream, void *resblock)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
 | 
					
						
							|  |  |  |    result is always in little endian byte order, so that a byte-wise | 
					
						
							|  |  |  |    output yields to the wanted ASCII representation of the message | 
					
						
							|  |  |  |    digest.  */ | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | extern void *__md5_buffer __P ((const char *buffer, size_t len, | 
					
						
							|  |  |  | 				void *resblock)); | 
					
						
							| 
									
										
										
										
											2000-11-20 18:54:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-04-02 21:41:37 +00:00
										 |  |  | #endif /* md5.h */
 |