md5.h 4.6 KB
Newer Older
Gerd Moellmann's avatar
Gerd Moellmann committed
1 2
/* Declaration of functions and data types used for MD5 sum computing
   library functions.
Paul Eggert's avatar
Paul Eggert committed
3 4
   Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2020 Free Software
   Foundation, Inc.
5
   This file is part of the GNU C Library.
Gerd Moellmann's avatar
Gerd Moellmann committed
6

7 8 9 10
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 3, or (at your option) any
   later version.
Gerd Moellmann's avatar
Gerd Moellmann committed
11

12
   This program is distributed in the hope that it will be useful,
Gerd Moellmann's avatar
Gerd Moellmann committed
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
Gerd Moellmann's avatar
Gerd Moellmann committed
16

17
   You should have received a copy of the GNU General Public License
Paul Eggert's avatar
Paul Eggert committed
18
   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
19 20 21 22 23

#ifndef _MD5_H
#define _MD5_H 1

#include <stdio.h>
24
#include <stdint.h>
Gerd Moellmann's avatar
Gerd Moellmann committed
25

26 27 28 29
# if HAVE_OPENSSL_MD5
#  include <openssl/md5.h>
# endif

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#define MD5_DIGEST_SIZE 16
#define MD5_BLOCK_SIZE 64

#ifndef __GNUC_PREREQ
# if defined __GNUC__ && defined __GNUC_MINOR__
#  define __GNUC_PREREQ(maj, min)                                       \
  ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
# else
#  define __GNUC_PREREQ(maj, min) 0
# endif
#endif

#ifndef __THROW
# if defined __cplusplus && __GNUC_PREREQ (2,8)
#  define __THROW       throw ()
# else
#  define __THROW
# endif
#endif

#ifndef _LIBC
# define __md5_buffer md5_buffer
# define __md5_finish_ctx md5_finish_ctx
# define __md5_init_ctx md5_init_ctx
# define __md5_process_block md5_process_block
# define __md5_process_bytes md5_process_bytes
# define __md5_read_ctx md5_read_ctx
# define __md5_stream md5_stream
Gerd Moellmann's avatar
Gerd Moellmann committed
58 59
#endif

60 61 62 63
# ifdef __cplusplus
extern "C" {
# endif

64 65 66 67
# if HAVE_OPENSSL_MD5
#  define GL_OPENSSL_NAME 5
#  include "gl_openssl.h"
# else
Gerd Moellmann's avatar
Gerd Moellmann committed
68 69 70
/* Structure to save state of computation between the single steps.  */
struct md5_ctx
{
71 72 73 74 75 76
  uint32_t A;
  uint32_t B;
  uint32_t C;
  uint32_t D;

  uint32_t total[2];
Paul Eggert's avatar
Paul Eggert committed
77 78
  uint32_t buflen;     /* ≥ 0, ≤ 128 */
  uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
Gerd Moellmann's avatar
Gerd Moellmann committed
79 80 81 82
};

/*
 * The following three functions are build up the low level used in
Paul Eggert's avatar
Paul Eggert committed
83
 * the functions 'md5_stream' and 'md5_buffer'.
Gerd Moellmann's avatar
Gerd Moellmann committed
84 85 86 87
 */

/* Initialize structure containing state of computation.
   (RFC 1321, 3.3: Step 3)  */
88
extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
Gerd Moellmann's avatar
Gerd Moellmann committed
89 90 91 92 93

/* 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!!! */
94 95
extern void __md5_process_block (const void *buffer, size_t len,
                                 struct md5_ctx *ctx) __THROW;
Gerd Moellmann's avatar
Gerd Moellmann committed
96 97 98 99 100

/* 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.  */
101 102
extern void __md5_process_bytes (const void *buffer, size_t len,
                                 struct md5_ctx *ctx) __THROW;
Gerd Moellmann's avatar
Gerd Moellmann committed
103 104 105 106

/* 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
107
   ASCII representation of the message digest.  */
Paul Eggert's avatar
Paul Eggert committed
108 109
extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *restrict resbuf)
     __THROW;
Gerd Moellmann's avatar
Gerd Moellmann committed
110 111 112 113


/* 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
114
   to the wanted ASCII representation of the message digest.  */
Paul Eggert's avatar
Paul Eggert committed
115 116
extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *restrict resbuf)
     __THROW;
Gerd Moellmann's avatar
Gerd Moellmann committed
117 118 119 120 121 122


/* 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.  */
123
extern void *__md5_buffer (const char *buffer, size_t len,
Paul Eggert's avatar
Paul Eggert committed
124
                           void *restrict resblock) __THROW;
125

126
# endif
Paul Eggert's avatar
Paul Eggert committed
127 128 129 130 131
/* Compute MD5 message digest for bytes read from STREAM.
   STREAM is an open file stream.  Regular files are handled more efficiently.
   The contents of STREAM from its current position to its end will be read.
   The case that the last operation on STREAM was an 'ungetc' is not supported.
   The resulting message digest number will be written into the 16 bytes
132 133 134 135
   beginning at RESBLOCK.  */
extern int __md5_stream (FILE *stream, void *resblock) __THROW;


136 137 138
# ifdef __cplusplus
}
# endif
Gerd Moellmann's avatar
Gerd Moellmann committed
139 140

#endif /* md5.h */
Paul Eggert's avatar
Paul Eggert committed
141 142 143 144 145 146 147

/*
 * Hey Emacs!
 * Local Variables:
 * coding: utf-8
 * End:
 */