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
13  *
14  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
15  *  not use this file except in compliance with the License.
16  *  You may obtain a copy of the License at
17  *
18  *  http://www.apache.org/licenses/LICENSE-2.0
19  *
20  *  Unless required by applicable law or agreed to in writing, software
21  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
22  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23  *  See the License for the specific language governing permissions and
24  *  limitations under the License.
25  */
26 #ifndef MBEDTLS_MD5_H
27 #define MBEDTLS_MD5_H
28 #include "mbedtls/private_access.h"
29 
30 #include "mbedtls/build_info.h"
31 
32 #include <stddef.h>
33 #include <stdint.h>
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 #if !defined(MBEDTLS_MD5_ALT)
40 // Regular implementation
41 //
42 
43 /**
44  * \brief          MD5 context structure
45  *
46  * \warning        MD5 is considered a weak message digest and its use
47  *                 constitutes a security risk. We recommend considering
48  *                 stronger message digests instead.
49  *
50  */
51 typedef struct mbedtls_md5_context {
52     uint32_t MBEDTLS_PRIVATE(total)[2];          /*!< number of bytes processed  */
53     uint32_t MBEDTLS_PRIVATE(state)[4];          /*!< intermediate digest state  */
54     unsigned char MBEDTLS_PRIVATE(buffer)[64];   /*!< data block being processed */
55 }
56 mbedtls_md5_context;
57 
58 #else  /* MBEDTLS_MD5_ALT */
59 #include "md5_alt.h"
60 #endif /* MBEDTLS_MD5_ALT */
61 
62 /**
63  * \brief          Initialize MD5 context
64  *
65  * \param ctx      MD5 context to be initialized
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_init(mbedtls_md5_context *ctx);
73 
74 /**
75  * \brief          Clear MD5 context
76  *
77  * \param ctx      MD5 context to be cleared
78  *
79  * \warning        MD5 is considered a weak message digest and its use
80  *                 constitutes a security risk. We recommend considering
81  *                 stronger message digests instead.
82  *
83  */
84 void mbedtls_md5_free(mbedtls_md5_context *ctx);
85 
86 /**
87  * \brief          Clone (the state of) an MD5 context
88  *
89  * \param dst      The destination context
90  * \param src      The context to be cloned
91  *
92  * \warning        MD5 is considered a weak message digest and its use
93  *                 constitutes a security risk. We recommend considering
94  *                 stronger message digests instead.
95  *
96  */
97 void mbedtls_md5_clone(mbedtls_md5_context *dst,
98                        const mbedtls_md5_context *src);
99 
100 /**
101  * \brief          MD5 context setup
102  *
103  * \param ctx      context to be initialized
104  *
105  * \return         0 if successful
106  *
107  * \warning        MD5 is considered a weak message digest and its use
108  *                 constitutes a security risk. We recommend considering
109  *                 stronger message digests instead.
110  *
111  */
112 int mbedtls_md5_starts(mbedtls_md5_context *ctx);
113 
114 /**
115  * \brief          MD5 process buffer
116  *
117  * \param ctx      MD5 context
118  * \param input    buffer holding the data
119  * \param ilen     length of the input data
120  *
121  * \return         0 if successful
122  *
123  * \warning        MD5 is considered a weak message digest and its use
124  *                 constitutes a security risk. We recommend considering
125  *                 stronger message digests instead.
126  *
127  */
128 int mbedtls_md5_update(mbedtls_md5_context *ctx,
129                        const unsigned char *input,
130                        size_t ilen);
131 
132 /**
133  * \brief          MD5 final digest
134  *
135  * \param ctx      MD5 context
136  * \param output   MD5 checksum result
137  *
138  * \return         0 if successful
139  *
140  * \warning        MD5 is considered a weak message digest and its use
141  *                 constitutes a security risk. We recommend considering
142  *                 stronger message digests instead.
143  *
144  */
145 int mbedtls_md5_finish(mbedtls_md5_context *ctx,
146                        unsigned char output[16]);
147 
148 /**
149  * \brief          MD5 process data block (internal use only)
150  *
151  * \param ctx      MD5 context
152  * \param data     buffer holding one block of data
153  *
154  * \return         0 if successful
155  *
156  * \warning        MD5 is considered a weak message digest and its use
157  *                 constitutes a security risk. We recommend considering
158  *                 stronger message digests instead.
159  *
160  */
161 int mbedtls_internal_md5_process(mbedtls_md5_context *ctx,
162                                  const unsigned char data[64]);
163 
164 /**
165  * \brief          Output = MD5( input buffer )
166  *
167  * \param input    buffer holding the data
168  * \param ilen     length of the input data
169  * \param output   MD5 checksum result
170  *
171  * \return         0 if successful
172  *
173  * \warning        MD5 is considered a weak message digest and its use
174  *                 constitutes a security risk. We recommend considering
175  *                 stronger message digests instead.
176  *
177  */
178 int mbedtls_md5(const unsigned char *input,
179                 size_t ilen,
180                 unsigned char output[16]);
181 
182 #if defined(MBEDTLS_SELF_TEST)
183 
184 /**
185  * \brief          Checkup routine
186  *
187  * \return         0 if successful, or 1 if the test failed
188  *
189  * \warning        MD5 is considered a weak message digest and its use
190  *                 constitutes a security risk. We recommend considering
191  *                 stronger message digests instead.
192  *
193  */
194 int mbedtls_md5_self_test(int verbose);
195 
196 #endif /* MBEDTLS_SELF_TEST */
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif /* mbedtls_md5.h */
203