1 /**
2  * \file md4.h
3  *
4  * \brief MD4 message digest algorithm (hash function)
5  *
6  * \warning MD4 is considered a weak message digest and its use constitutes a
7  *          security risk. We recommend considering stronger message digests
8  *          instead.
9  */
10 /*
11  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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  *  This file is part of mbed TLS (https://tls.mbed.org)
27  *
28  */
29 #ifndef MBEDTLS_MD4_H
30 #define MBEDTLS_MD4_H
31 
32 #if !defined(MBEDTLS_CONFIG_FILE)
33 #include "config.h"
34 #else
35 #include MBEDTLS_CONFIG_FILE
36 #endif
37 
38 #include <stddef.h>
39 #include <stdint.h>
40 
41 /* MBEDTLS_ERR_MD4_HW_ACCEL_FAILED is deprecated and should not be used. */
42 #define MBEDTLS_ERR_MD4_HW_ACCEL_FAILED                   -0x002D  /**< MD4 hardware accelerator failed */
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #if !defined(MBEDTLS_MD4_ALT)
49 // Regular implementation
50 //
51 
52 /**
53  * \brief          MD4 context structure
54  *
55  * \warning        MD4 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 typedef struct mbedtls_md4_context
61 {
62     uint32_t total[2];          /*!< number of bytes processed  */
63     uint32_t state[4];          /*!< intermediate digest state  */
64     unsigned char buffer[64];   /*!< data block being processed */
65 }
66 mbedtls_md4_context;
67 
68 #else  /* MBEDTLS_MD4_ALT */
69 #include "md4_alt.h"
70 #endif /* MBEDTLS_MD4_ALT */
71 
72 /**
73  * \brief          Initialize MD4 context
74  *
75  * \param ctx      MD4 context to be initialized
76  *
77  * \warning        MD4 is considered a weak message digest and its use
78  *                 constitutes a security risk. We recommend considering
79  *                 stronger message digests instead.
80  *
81  */
82 void mbedtls_md4_init( mbedtls_md4_context *ctx );
83 
84 /**
85  * \brief          Clear MD4 context
86  *
87  * \param ctx      MD4 context to be cleared
88  *
89  * \warning        MD4 is considered a weak message digest and its use
90  *                 constitutes a security risk. We recommend considering
91  *                 stronger message digests instead.
92  *
93  */
94 void mbedtls_md4_free( mbedtls_md4_context *ctx );
95 
96 /**
97  * \brief          Clone (the state of) an MD4 context
98  *
99  * \param dst      The destination context
100  * \param src      The context to be cloned
101  *
102  * \warning        MD4 is considered a weak message digest and its use
103  *                 constitutes a security risk. We recommend considering
104  *                 stronger message digests instead.
105  *
106  */
107 void mbedtls_md4_clone( mbedtls_md4_context *dst,
108                         const mbedtls_md4_context *src );
109 
110 /**
111  * \brief          MD4 context setup
112  *
113  * \param ctx      context to be initialized
114  *
115  * \return         0 if successful
116  *
117  * \warning        MD4 is considered a weak message digest and its use
118  *                 constitutes a security risk. We recommend considering
119  *                 stronger message digests instead.
120  */
121 int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx );
122 
123 /**
124  * \brief          MD4 process buffer
125  *
126  * \param ctx      MD4 context
127  * \param input    buffer holding the data
128  * \param ilen     length of the input data
129  *
130  * \return         0 if successful
131  *
132  * \warning        MD4 is considered a weak message digest and its use
133  *                 constitutes a security risk. We recommend considering
134  *                 stronger message digests instead.
135  *
136  */
137 int mbedtls_md4_update_ret( mbedtls_md4_context *ctx,
138                             const unsigned char *input,
139                             size_t ilen );
140 
141 /**
142  * \brief          MD4 final digest
143  *
144  * \param ctx      MD4 context
145  * \param output   MD4 checksum result
146  *
147  * \return         0 if successful
148  *
149  * \warning        MD4 is considered a weak message digest and its use
150  *                 constitutes a security risk. We recommend considering
151  *                 stronger message digests instead.
152  *
153  */
154 int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx,
155                             unsigned char output[16] );
156 
157 /**
158  * \brief          MD4 process data block (internal use only)
159  *
160  * \param ctx      MD4 context
161  * \param data     buffer holding one block of data
162  *
163  * \return         0 if successful
164  *
165  * \warning        MD4 is considered a weak message digest and its use
166  *                 constitutes a security risk. We recommend considering
167  *                 stronger message digests instead.
168  *
169  */
170 int mbedtls_internal_md4_process( mbedtls_md4_context *ctx,
171                                   const unsigned char data[64] );
172 
173 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
174 #if defined(MBEDTLS_DEPRECATED_WARNING)
175 #define MBEDTLS_DEPRECATED      __attribute__((deprecated))
176 #else
177 #define MBEDTLS_DEPRECATED
178 #endif
179 /**
180  * \brief          MD4 context setup
181  *
182  * \deprecated     Superseded by mbedtls_md4_starts_ret() in 2.7.0
183  *
184  * \param ctx      context to be initialized
185  *
186  * \warning        MD4 is considered a weak message digest and its use
187  *                 constitutes a security risk. We recommend considering
188  *                 stronger message digests instead.
189  *
190  */
191 MBEDTLS_DEPRECATED void mbedtls_md4_starts( mbedtls_md4_context *ctx );
192 
193 /**
194  * \brief          MD4 process buffer
195  *
196  * \deprecated     Superseded by mbedtls_md4_update_ret() in 2.7.0
197  *
198  * \param ctx      MD4 context
199  * \param input    buffer holding the data
200  * \param ilen     length of the input data
201  *
202  * \warning        MD4 is considered a weak message digest and its use
203  *                 constitutes a security risk. We recommend considering
204  *                 stronger message digests instead.
205  *
206  */
207 MBEDTLS_DEPRECATED void mbedtls_md4_update( mbedtls_md4_context *ctx,
208                                             const unsigned char *input,
209                                             size_t ilen );
210 
211 /**
212  * \brief          MD4 final digest
213  *
214  * \deprecated     Superseded by mbedtls_md4_finish_ret() in 2.7.0
215  *
216  * \param ctx      MD4 context
217  * \param output   MD4 checksum result
218  *
219  * \warning        MD4 is considered a weak message digest and its use
220  *                 constitutes a security risk. We recommend considering
221  *                 stronger message digests instead.
222  *
223  */
224 MBEDTLS_DEPRECATED void mbedtls_md4_finish( mbedtls_md4_context *ctx,
225                                             unsigned char output[16] );
226 
227 /**
228  * \brief          MD4 process data block (internal use only)
229  *
230  * \deprecated     Superseded by mbedtls_internal_md4_process() in 2.7.0
231  *
232  * \param ctx      MD4 context
233  * \param data     buffer holding one block of data
234  *
235  * \warning        MD4 is considered a weak message digest and its use
236  *                 constitutes a security risk. We recommend considering
237  *                 stronger message digests instead.
238  *
239  */
240 MBEDTLS_DEPRECATED void mbedtls_md4_process( mbedtls_md4_context *ctx,
241                                              const unsigned char data[64] );
242 
243 #undef MBEDTLS_DEPRECATED
244 #endif /* !MBEDTLS_DEPRECATED_REMOVED */
245 
246 /**
247  * \brief          Output = MD4( input buffer )
248  *
249  * \param input    buffer holding the data
250  * \param ilen     length of the input data
251  * \param output   MD4 checksum result
252  *
253  * \return         0 if successful
254  *
255  * \warning        MD4 is considered a weak message digest and its use
256  *                 constitutes a security risk. We recommend considering
257  *                 stronger message digests instead.
258  *
259  */
260 int mbedtls_md4_ret( const unsigned char *input,
261                      size_t ilen,
262                      unsigned char output[16] );
263 
264 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
265 #if defined(MBEDTLS_DEPRECATED_WARNING)
266 #define MBEDTLS_DEPRECATED      __attribute__((deprecated))
267 #else
268 #define MBEDTLS_DEPRECATED
269 #endif
270 /**
271  * \brief          Output = MD4( input buffer )
272  *
273  * \deprecated     Superseded by mbedtls_md4_ret() in 2.7.0
274  *
275  * \param input    buffer holding the data
276  * \param ilen     length of the input data
277  * \param output   MD4 checksum result
278  *
279  * \warning        MD4 is considered a weak message digest and its use
280  *                 constitutes a security risk. We recommend considering
281  *                 stronger message digests instead.
282  *
283  */
284 MBEDTLS_DEPRECATED void mbedtls_md4( const unsigned char *input,
285                                      size_t ilen,
286                                      unsigned char output[16] );
287 
288 #undef MBEDTLS_DEPRECATED
289 #endif /* !MBEDTLS_DEPRECATED_REMOVED */
290 
291 /**
292  * \brief          Checkup routine
293  *
294  * \return         0 if successful, or 1 if the test failed
295  *
296  * \warning        MD4 is considered a weak message digest and its use
297  *                 constitutes a security risk. We recommend considering
298  *                 stronger message digests instead.
299  *
300  */
301 int mbedtls_md4_self_test( int verbose );
302 
303 #ifdef __cplusplus
304 }
305 #endif
306 
307 #endif /* mbedtls_md4.h */
308