1 /**
2  * \file md5.h
3  *
4  * \brief MD5 message digest algorithm (hash function)
5  *
6  * \warning   MD5 is considered a weak message digest and its use constitutes a
7  *            security risk. We recommend considering stronger message
8  *            digests instead.
9  */
10 /*
11  *  Copyright The Mbed TLS Contributors
12  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
13  */
14 #ifndef MBEDTLS_MD5_H
15 #define MBEDTLS_MD5_H
16 #include "mbedtls/private_access.h"
17 
18 #include "mbedtls/build_info.h"
19 
20 #include <stddef.h>
21 #include <stdint.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #if !defined(MBEDTLS_MD5_ALT)
28 // Regular implementation
29 //
30 
31 /**
32  * \brief          MD5 context structure
33  *
34  * \warning        MD5 is considered a weak message digest and its use
35  *                 constitutes a security risk. We recommend considering
36  *                 stronger message digests instead.
37  *
38  */
39 typedef struct mbedtls_md5_context {
40     uint32_t MBEDTLS_PRIVATE(total)[2];          /*!< number of bytes processed  */
41     uint32_t MBEDTLS_PRIVATE(state)[4];          /*!< intermediate digest state  */
42     unsigned char MBEDTLS_PRIVATE(buffer)[64];   /*!< data block being processed */
43 }
44 mbedtls_md5_context;
45 
46 #else  /* MBEDTLS_MD5_ALT */
47 #include "md5_alt.h"
48 #endif /* MBEDTLS_MD5_ALT */
49 
50 /**
51  * \brief          Initialize MD5 context
52  *
53  * \param ctx      MD5 context to be initialized
54  *
55  * \warning        MD5 is considered a weak message digest and its use
56  *                 constitutes a security risk. We recommend considering
57  *                 stronger message digests instead.
58  *
59  */
60 void mbedtls_md5_init(mbedtls_md5_context *ctx);
61 
62 /**
63  * \brief          Clear MD5 context
64  *
65  * \param ctx      MD5 context to be cleared
66  *
67  * \warning        MD5 is considered a weak message digest and its use
68  *                 constitutes a security risk. We recommend considering
69  *                 stronger message digests instead.
70  *
71  */
72 void mbedtls_md5_free(mbedtls_md5_context *ctx);
73 
74 /**
75  * \brief          Clone (the state of) an MD5 context
76  *
77  * \param dst      The destination context
78  * \param src      The context to be cloned
79  *
80  * \warning        MD5 is considered a weak message digest and its use
81  *                 constitutes a security risk. We recommend considering
82  *                 stronger message digests instead.
83  *
84  */
85 void mbedtls_md5_clone(mbedtls_md5_context *dst,
86                        const mbedtls_md5_context *src);
87 
88 /**
89  * \brief          MD5 context setup
90  *
91  * \param ctx      context to be initialized
92  *
93  * \return         0 if successful
94  *
95  * \warning        MD5 is considered a weak message digest and its use
96  *                 constitutes a security risk. We recommend considering
97  *                 stronger message digests instead.
98  *
99  */
100 int mbedtls_md5_starts(mbedtls_md5_context *ctx);
101 
102 /**
103  * \brief          MD5 process buffer
104  *
105  * \param ctx      MD5 context
106  * \param input    buffer holding the data
107  * \param ilen     length of the input data
108  *
109  * \return         0 if successful
110  *
111  * \warning        MD5 is considered a weak message digest and its use
112  *                 constitutes a security risk. We recommend considering
113  *                 stronger message digests instead.
114  *
115  */
116 int mbedtls_md5_update(mbedtls_md5_context *ctx,
117                        const unsigned char *input,
118                        size_t ilen);
119 
120 /**
121  * \brief          MD5 final digest
122  *
123  * \param ctx      MD5 context
124  * \param output   MD5 checksum result
125  *
126  * \return         0 if successful
127  *
128  * \warning        MD5 is considered a weak message digest and its use
129  *                 constitutes a security risk. We recommend considering
130  *                 stronger message digests instead.
131  *
132  */
133 int mbedtls_md5_finish(mbedtls_md5_context *ctx,
134                        unsigned char output[16]);
135 
136 /**
137  * \brief          MD5 process data block (internal use only)
138  *
139  * \param ctx      MD5 context
140  * \param data     buffer holding one block of data
141  *
142  * \return         0 if successful
143  *
144  * \warning        MD5 is considered a weak message digest and its use
145  *                 constitutes a security risk. We recommend considering
146  *                 stronger message digests instead.
147  *
148  */
149 int mbedtls_internal_md5_process(mbedtls_md5_context *ctx,
150                                  const unsigned char data[64]);
151 
152 /**
153  * \brief          Output = MD5( input buffer )
154  *
155  * \param input    buffer holding the data
156  * \param ilen     length of the input data
157  * \param output   MD5 checksum result
158  *
159  * \return         0 if successful
160  *
161  * \warning        MD5 is considered a weak message digest and its use
162  *                 constitutes a security risk. We recommend considering
163  *                 stronger message digests instead.
164  *
165  */
166 int mbedtls_md5(const unsigned char *input,
167                 size_t ilen,
168                 unsigned char output[16]);
169 
170 #if defined(MBEDTLS_SELF_TEST)
171 
172 /**
173  * \brief          Checkup routine
174  *
175  * \return         0 if successful, or 1 if the test failed
176  *
177  * \warning        MD5 is considered a weak message digest and its use
178  *                 constitutes a security risk. We recommend considering
179  *                 stronger message digests instead.
180  *
181  */
182 int mbedtls_md5_self_test(int verbose);
183 
184 #endif /* MBEDTLS_SELF_TEST */
185 
186 #ifdef __cplusplus
187 }
188 #endif
189 
190 #endif /* mbedtls_md5.h */
191