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 {
53     uint32_t MBEDTLS_PRIVATE(total)[2];          /*!< number of bytes processed  */
54     uint32_t MBEDTLS_PRIVATE(state)[4];          /*!< intermediate digest state  */
55     unsigned char MBEDTLS_PRIVATE(buffer)[64];   /*!< data block being processed */
56 }
57 mbedtls_md5_context;
58 
59 #else  /* MBEDTLS_MD5_ALT */
60 #include "md5_alt.h"
61 #endif /* MBEDTLS_MD5_ALT */
62 
63 /**
64  * \brief          Initialize MD5 context
65  *
66  * \param ctx      MD5 context to be initialized
67  *
68  * \warning        MD5 is considered a weak message digest and its use
69  *                 constitutes a security risk. We recommend considering
70  *                 stronger message digests instead.
71  *
72  */
73 void mbedtls_md5_init( mbedtls_md5_context *ctx );
74 
75 /**
76  * \brief          Clear MD5 context
77  *
78  * \param ctx      MD5 context to be cleared
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_free( mbedtls_md5_context *ctx );
86 
87 /**
88  * \brief          Clone (the state of) an MD5 context
89  *
90  * \param dst      The destination context
91  * \param src      The context to be cloned
92  *
93  * \warning        MD5 is considered a weak message digest and its use
94  *                 constitutes a security risk. We recommend considering
95  *                 stronger message digests instead.
96  *
97  */
98 void mbedtls_md5_clone( mbedtls_md5_context *dst,
99                         const mbedtls_md5_context *src );
100 
101 /**
102  * \brief          MD5 context setup
103  *
104  * \param ctx      context to be initialized
105  *
106  * \return         0 if successful
107  *
108  * \warning        MD5 is considered a weak message digest and its use
109  *                 constitutes a security risk. We recommend considering
110  *                 stronger message digests instead.
111  *
112  */
113 int mbedtls_md5_starts( mbedtls_md5_context *ctx );
114 
115 /**
116  * \brief          MD5 process buffer
117  *
118  * \param ctx      MD5 context
119  * \param input    buffer holding the data
120  * \param ilen     length of the input data
121  *
122  * \return         0 if successful
123  *
124  * \warning        MD5 is considered a weak message digest and its use
125  *                 constitutes a security risk. We recommend considering
126  *                 stronger message digests instead.
127  *
128  */
129 int mbedtls_md5_update( mbedtls_md5_context *ctx,
130                         const unsigned char *input,
131                         size_t ilen );
132 
133 /**
134  * \brief          MD5 final digest
135  *
136  * \param ctx      MD5 context
137  * \param output   MD5 checksum result
138  *
139  * \return         0 if successful
140  *
141  * \warning        MD5 is considered a weak message digest and its use
142  *                 constitutes a security risk. We recommend considering
143  *                 stronger message digests instead.
144  *
145  */
146 int mbedtls_md5_finish( mbedtls_md5_context *ctx,
147                         unsigned char output[16] );
148 
149 /**
150  * \brief          MD5 process data block (internal use only)
151  *
152  * \param ctx      MD5 context
153  * \param data     buffer holding one block of data
154  *
155  * \return         0 if successful
156  *
157  * \warning        MD5 is considered a weak message digest and its use
158  *                 constitutes a security risk. We recommend considering
159  *                 stronger message digests instead.
160  *
161  */
162 int mbedtls_internal_md5_process( mbedtls_md5_context *ctx,
163                                   const unsigned char data[64] );
164 
165 /**
166  * \brief          Output = MD5( input buffer )
167  *
168  * \param input    buffer holding the data
169  * \param ilen     length of the input data
170  * \param output   MD5 checksum result
171  *
172  * \return         0 if successful
173  *
174  * \warning        MD5 is considered a weak message digest and its use
175  *                 constitutes a security risk. We recommend considering
176  *                 stronger message digests instead.
177  *
178  */
179 int mbedtls_md5( const unsigned char *input,
180                  size_t ilen,
181                  unsigned char output[16] );
182 
183 #if defined(MBEDTLS_SELF_TEST)
184 
185 /**
186  * \brief          Checkup routine
187  *
188  * \return         0 if successful, or 1 if the test failed
189  *
190  * \warning        MD5 is considered a weak message digest and its use
191  *                 constitutes a security risk. We recommend considering
192  *                 stronger message digests instead.
193  *
194  */
195 int mbedtls_md5_self_test( int verbose );
196 
197 #endif /* MBEDTLS_SELF_TEST */
198 
199 #ifdef __cplusplus
200 }
201 #endif
202 
203 #endif /* mbedtls_md5.h */
204