(linenum→info "unix/slp.c:2238")

glibc/2.7/crypt/md5.h

    1: /* Declaration of functions and data types used for MD5 sum computing
    2:    library functions.
    3:    Copyright (C) 1995-1997,1999,2000,2001,2004,2005
    4:       Free Software Foundation, Inc.
    5:    This file is part of the GNU C Library.
    6: 
    7:    The GNU C Library is free software; you can redistribute it and/or
    8:    modify it under the terms of the GNU Lesser General Public
    9:    License as published by the Free Software Foundation; either
   10:    version 2.1 of the License, or (at your option) any later version.
   11: 
   12:    The GNU C Library 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 GNU
   15:    Lesser General Public License for more details.
   16: 
   17:    You should have received a copy of the GNU Lesser General Public
   18:    License along with the GNU C Library; if not, write to the Free
   19:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   20:    02111-1307 USA.  */
   21: 
   22: #ifndef _MD5_H
   23: #define _MD5_H 1
   24: 
   25: #include <stdio.h>
   26: 
   27: #if defined HAVE_LIMITS_H || _LIBC
   28: # include <limits.h>
   29: #endif
   30: 
   31: #define MD5_DIGEST_SIZE 16
   32: #define MD5_BLOCK_SIZE 64
   33: 
   34: /* The following contortions are an attempt to use the C preprocessor
   35:    to determine an unsigned integral type that is 32 bits wide.  An
   36:    alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
   37:    doing that would require that the configure script compile and *run*
   38:    the resulting executable.  Locally running cross-compiled executables
   39:    is usually not possible.  */
   40: 
   41: #ifdef _LIBC
   42: # include <stdint.h>
   43: typedef uint32_t md5_uint32;
   44: typedef uintptr_t md5_uintptr;
   45: #else
   46: # if defined __STDC__ && __STDC__
   47: #  define UINT_MAX_32_BITS 4294967295U
   48: # else
   49: #  define UINT_MAX_32_BITS 0xFFFFFFFF
   50: # endif
   51: 
   52: /* If UINT_MAX isn't defined, assume it's a 32-bit type.
   53:    This should be valid for all systems GNU cares about because
   54:    that doesn't include 16-bit systems, and only modern systems
   55:    (that certainly have <limits.h>) have 64+-bit integral types.  */
   56: 
   57: # ifndef UINT_MAX
   58: #  define UINT_MAX UINT_MAX_32_BITS
   59: # endif
   60: 
   61: # if UINT_MAX == UINT_MAX_32_BITS
   62:    typedef unsigned int md5_uint32;
   63: # else
   64: #  if USHRT_MAX == UINT_MAX_32_BITS
   65:     typedef unsigned short md5_uint32;
   66: #  else
   67: #   if ULONG_MAX == UINT_MAX_32_BITS
   68:      typedef unsigned long md5_uint32;
   69: #   else
   70:      /* The following line is intended to evoke an error.
   71:         Using #error is not portable enough.  */
   72:      "Cannot determine unsigned 32-bit data type."
   73: #   endif
   74: #  endif
   75: # endif
   76: /* We have to make a guess about the integer type equivalent in size
   77:    to pointers which should always be correct.  */
   78: typedef unsigned long int md5_uintptr;
   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] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
   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: /* Initialize structure containing state of computation.
  100:    (RFC 1321, 3.3: Step 3)  */
  101: extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
  102: 
  103: /* Starting with the result of former calls of this function (or the
  104:    initialization function update the context for the next LEN bytes
  105:    starting at BUFFER.
  106:    It is necessary that LEN is a multiple of 64!!! */
  107: extern void __md5_process_block (const void *buffer, size_t len,
  108:                                  struct md5_ctx *ctx) __THROW;
  109: 
  110: /* Starting with the result of former calls of this function (or the
  111:    initialization function update the context for the next LEN bytes
  112:    starting at BUFFER.
  113:    It is NOT required that LEN is a multiple of 64.  */
  114: extern void __md5_process_bytes (const void *buffer, size_t len,
  115:                                  struct md5_ctx *ctx) __THROW;
  116: 
  117: /* Process the remaining bytes in the buffer and put result from CTX
  118:    in first 16 bytes following RESBUF.  The result is always in little
  119:    endian byte order, so that a byte-wise output yields to the wanted
  120:    ASCII representation of the message digest.
  121: 
  122:    IMPORTANT: On some systems it is required that RESBUF is correctly
  123:    aligned for a 32 bits value.  */
  124: extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
  125: 
  126: 
  127: /* Put result from CTX in first 16 bytes following RESBUF.  The result is
  128:    always in little endian byte order, so that a byte-wise output yields
  129:    to the wanted ASCII representation of the message digest.
  130: 
  131:    IMPORTANT: On some systems it is required that RESBUF is correctly
  132:    aligned for a 32 bits value.  */
  133: extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
  134: 
  135: 
  136: /* Compute MD5 message digest for bytes read from STREAM.  The
  137:    resulting message digest number will be written into the 16 bytes
  138:    beginning at RESBLOCK.  */
  139: extern int __md5_stream (FILE *stream, void *resblock) __THROW;
  140: 
  141: /* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
  142:    result is always in little endian byte order, so that a byte-wise
  143:    output yields to the wanted ASCII representation of the message
  144:    digest.  */
  145: extern void *__md5_buffer (const char *buffer, size_t len,
  146:                            void *resblock) __THROW;
  147: 
  148: #endif /* md5.h */
Syntax (Markdown)