Coverage Report

Created: 2025-07-01 06:54

/work/mbedtls-2.28.8/library/ripemd160.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 *  RIPE MD-160 implementation
3
 *
4
 *  Copyright The Mbed TLS Contributors
5
 *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6
 */
7
8
/*
9
 *  The RIPEMD-160 algorithm was designed by RIPE in 1996
10
 *  http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html
11
 *  http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
12
 */
13
14
#include "common.h"
15
16
#if defined(MBEDTLS_RIPEMD160_C)
17
18
#include "mbedtls/ripemd160.h"
19
#include "mbedtls/platform_util.h"
20
#include "mbedtls/error.h"
21
22
#include <string.h>
23
24
#include "mbedtls/platform.h"
25
26
#if !defined(MBEDTLS_RIPEMD160_ALT)
27
28
void mbedtls_ripemd160_init(mbedtls_ripemd160_context *ctx)
29
0
{
30
0
    memset(ctx, 0, sizeof(mbedtls_ripemd160_context));
31
0
}
32
33
void mbedtls_ripemd160_free(mbedtls_ripemd160_context *ctx)
34
0
{
35
0
    if (ctx == NULL) {
36
0
        return;
37
0
    }
38
39
0
    mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ripemd160_context));
40
0
}
41
42
void mbedtls_ripemd160_clone(mbedtls_ripemd160_context *dst,
43
                             const mbedtls_ripemd160_context *src)
44
0
{
45
0
    *dst = *src;
46
0
}
47
48
/*
49
 * RIPEMD-160 context setup
50
 */
51
int mbedtls_ripemd160_starts_ret(mbedtls_ripemd160_context *ctx)
52
0
{
53
0
    ctx->total[0] = 0;
54
0
    ctx->total[1] = 0;
55
56
0
    ctx->state[0] = 0x67452301;
57
0
    ctx->state[1] = 0xEFCDAB89;
58
0
    ctx->state[2] = 0x98BADCFE;
59
0
    ctx->state[3] = 0x10325476;
60
0
    ctx->state[4] = 0xC3D2E1F0;
61
62
0
    return 0;
63
0
}
64
65
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
66
void mbedtls_ripemd160_starts(mbedtls_ripemd160_context *ctx)
67
0
{
68
0
    mbedtls_ripemd160_starts_ret(ctx);
69
0
}
70
#endif
71
72
#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
73
/*
74
 * Process one block
75
 */
76
int mbedtls_internal_ripemd160_process(mbedtls_ripemd160_context *ctx,
77
                                       const unsigned char data[64])
78
0
{
79
0
    struct {
80
0
        uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
81
0
    } local;
82
83
0
    local.X[0] = MBEDTLS_GET_UINT32_LE(data,  0);
84
0
    local.X[1] = MBEDTLS_GET_UINT32_LE(data,  4);
85
0
    local.X[2] = MBEDTLS_GET_UINT32_LE(data,  8);
86
0
    local.X[3] = MBEDTLS_GET_UINT32_LE(data, 12);
87
0
    local.X[4] = MBEDTLS_GET_UINT32_LE(data, 16);
88
0
    local.X[5] = MBEDTLS_GET_UINT32_LE(data, 20);
89
0
    local.X[6] = MBEDTLS_GET_UINT32_LE(data, 24);
90
0
    local.X[7] = MBEDTLS_GET_UINT32_LE(data, 28);
91
0
    local.X[8] = MBEDTLS_GET_UINT32_LE(data, 32);
92
0
    local.X[9] = MBEDTLS_GET_UINT32_LE(data, 36);
93
0
    local.X[10] = MBEDTLS_GET_UINT32_LE(data, 40);
94
0
    local.X[11] = MBEDTLS_GET_UINT32_LE(data, 44);
95
0
    local.X[12] = MBEDTLS_GET_UINT32_LE(data, 48);
96
0
    local.X[13] = MBEDTLS_GET_UINT32_LE(data, 52);
97
0
    local.X[14] = MBEDTLS_GET_UINT32_LE(data, 56);
98
0
    local.X[15] = MBEDTLS_GET_UINT32_LE(data, 60);
99
100
0
    local.A = local.Ap = ctx->state[0];
101
0
    local.B = local.Bp = ctx->state[1];
102
0
    local.C = local.Cp = ctx->state[2];
103
0
    local.D = local.Dp = ctx->state[3];
104
0
    local.E = local.Ep = ctx->state[4];
105
106
0
#define F1(x, y, z)   ((x) ^ (y) ^ (z))
107
0
#define F2(x, y, z)   (((x) & (y)) | (~(x) & (z)))
108
0
#define F3(x, y, z)   (((x) | ~(y)) ^ (z))
109
0
#define F4(x, y, z)   (((x) & (z)) | ((y) & ~(z)))
110
0
#define F5(x, y, z)   ((x) ^ ((y) | ~(z)))
111
112
0
#define S(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
113
114
0
#define P(a, b, c, d, e, r, s, f, k)                      \
115
0
    do                                                      \
116
0
    {                                                       \
117
0
        (a) += f((b), (c), (d)) + local.X[r] + (k);       \
118
0
        (a) = S((a), (s)) + (e);                          \
119
0
        (c) = S((c), 10);                                 \
120
0
    } while (0)
121
122
0
#define P2(a, b, c, d, e, r, s, rp, sp)                               \
123
0
    do                                                                  \
124
0
    {                                                                   \
125
0
        P((a), (b), (c), (d), (e), (r), (s), F, K);                   \
126
0
        P(a ## p, b ## p, c ## p, d ## p, e ## p,                      \
127
0
          (rp), (sp), Fp, Kp);                                        \
128
0
    } while (0)
129
130
0
#define F   F1
131
0
#define K   0x00000000
132
0
#define Fp  F5
133
0
#define Kp  0x50A28BE6
134
0
    P2(local.A, local.B, local.C, local.D, local.E,  0, 11,  5,  8);
135
0
    P2(local.E, local.A, local.B, local.C, local.D,  1, 14, 14,  9);
136
0
    P2(local.D, local.E, local.A, local.B, local.C,  2, 15,  7,  9);
137
0
    P2(local.C, local.D, local.E, local.A, local.B,  3, 12,  0, 11);
138
0
    P2(local.B, local.C, local.D, local.E, local.A,  4,  5,  9, 13);
139
0
    P2(local.A, local.B, local.C, local.D, local.E,  5,  8,  2, 15);
140
0
    P2(local.E, local.A, local.B, local.C, local.D,  6,  7, 11, 15);
141
0
    P2(local.D, local.E, local.A, local.B, local.C,  7,  9,  4,  5);
142
0
    P2(local.C, local.D, local.E, local.A, local.B,  8, 11, 13,  7);
143
0
    P2(local.B, local.C, local.D, local.E, local.A,  9, 13,  6,  7);
144
0
    P2(local.A, local.B, local.C, local.D, local.E, 10, 14, 15,  8);
145
0
    P2(local.E, local.A, local.B, local.C, local.D, 11, 15,  8, 11);
146
0
    P2(local.D, local.E, local.A, local.B, local.C, 12,  6,  1, 14);
147
0
    P2(local.C, local.D, local.E, local.A, local.B, 13,  7, 10, 14);
148
0
    P2(local.B, local.C, local.D, local.E, local.A, 14,  9,  3, 12);
149
0
    P2(local.A, local.B, local.C, local.D, local.E, 15,  8, 12,  6);
150
0
#undef F
151
0
#undef K
152
0
#undef Fp
153
0
#undef Kp
154
155
0
#define F   F2
156
0
#define K   0x5A827999
157
0
#define Fp  F4
158
0
#define Kp  0x5C4DD124
159
0
    P2(local.E, local.A, local.B, local.C, local.D,  7,  7,  6,  9);
160
0
    P2(local.D, local.E, local.A, local.B, local.C,  4,  6, 11, 13);
161
0
    P2(local.C, local.D, local.E, local.A, local.B, 13,  8,  3, 15);
162
0
    P2(local.B, local.C, local.D, local.E, local.A,  1, 13,  7,  7);
163
0
    P2(local.A, local.B, local.C, local.D, local.E, 10, 11,  0, 12);
164
0
    P2(local.E, local.A, local.B, local.C, local.D,  6,  9, 13,  8);
165
0
    P2(local.D, local.E, local.A, local.B, local.C, 15,  7,  5,  9);
166
0
    P2(local.C, local.D, local.E, local.A, local.B,  3, 15, 10, 11);
167
0
    P2(local.B, local.C, local.D, local.E, local.A, 12,  7, 14,  7);
168
0
    P2(local.A, local.B, local.C, local.D, local.E,  0, 12, 15,  7);
169
0
    P2(local.E, local.A, local.B, local.C, local.D,  9, 15,  8, 12);
170
0
    P2(local.D, local.E, local.A, local.B, local.C,  5,  9, 12,  7);
171
0
    P2(local.C, local.D, local.E, local.A, local.B,  2, 11,  4,  6);
172
0
    P2(local.B, local.C, local.D, local.E, local.A, 14,  7,  9, 15);
173
0
    P2(local.A, local.B, local.C, local.D, local.E, 11, 13,  1, 13);
174
0
    P2(local.E, local.A, local.B, local.C, local.D,  8, 12,  2, 11);
175
0
#undef F
176
0
#undef K
177
0
#undef Fp
178
0
#undef Kp
179
180
0
#define F   F3
181
0
#define K   0x6ED9EBA1
182
0
#define Fp  F3
183
0
#define Kp  0x6D703EF3
184
0
    P2(local.D, local.E, local.A, local.B, local.C,  3, 11, 15,  9);
185
0
    P2(local.C, local.D, local.E, local.A, local.B, 10, 13,  5,  7);
186
0
    P2(local.B, local.C, local.D, local.E, local.A, 14,  6,  1, 15);
187
0
    P2(local.A, local.B, local.C, local.D, local.E,  4,  7,  3, 11);
188
0
    P2(local.E, local.A, local.B, local.C, local.D,  9, 14,  7,  8);
189
0
    P2(local.D, local.E, local.A, local.B, local.C, 15,  9, 14,  6);
190
0
    P2(local.C, local.D, local.E, local.A, local.B,  8, 13,  6,  6);
191
0
    P2(local.B, local.C, local.D, local.E, local.A,  1, 15,  9, 14);
192
0
    P2(local.A, local.B, local.C, local.D, local.E,  2, 14, 11, 12);
193
0
    P2(local.E, local.A, local.B, local.C, local.D,  7,  8,  8, 13);
194
0
    P2(local.D, local.E, local.A, local.B, local.C,  0, 13, 12,  5);
195
0
    P2(local.C, local.D, local.E, local.A, local.B,  6,  6,  2, 14);
196
0
    P2(local.B, local.C, local.D, local.E, local.A, 13,  5, 10, 13);
197
0
    P2(local.A, local.B, local.C, local.D, local.E, 11, 12,  0, 13);
198
0
    P2(local.E, local.A, local.B, local.C, local.D,  5,  7,  4,  7);
199
0
    P2(local.D, local.E, local.A, local.B, local.C, 12,  5, 13,  5);
200
0
#undef F
201
0
#undef K
202
0
#undef Fp
203
0
#undef Kp
204
205
0
#define F   F4
206
0
#define K   0x8F1BBCDC
207
0
#define Fp  F2
208
0
#define Kp  0x7A6D76E9
209
0
    P2(local.C, local.D, local.E, local.A, local.B,  1, 11,  8, 15);
210
0
    P2(local.B, local.C, local.D, local.E, local.A,  9, 12,  6,  5);
211
0
    P2(local.A, local.B, local.C, local.D, local.E, 11, 14,  4,  8);
212
0
    P2(local.E, local.A, local.B, local.C, local.D, 10, 15,  1, 11);
213
0
    P2(local.D, local.E, local.A, local.B, local.C,  0, 14,  3, 14);
214
0
    P2(local.C, local.D, local.E, local.A, local.B,  8, 15, 11, 14);
215
0
    P2(local.B, local.C, local.D, local.E, local.A, 12,  9, 15,  6);
216
0
    P2(local.A, local.B, local.C, local.D, local.E,  4,  8,  0, 14);
217
0
    P2(local.E, local.A, local.B, local.C, local.D, 13,  9,  5,  6);
218
0
    P2(local.D, local.E, local.A, local.B, local.C,  3, 14, 12,  9);
219
0
    P2(local.C, local.D, local.E, local.A, local.B,  7,  5,  2, 12);
220
0
    P2(local.B, local.C, local.D, local.E, local.A, 15,  6, 13,  9);
221
0
    P2(local.A, local.B, local.C, local.D, local.E, 14,  8,  9, 12);
222
0
    P2(local.E, local.A, local.B, local.C, local.D,  5,  6,  7,  5);
223
0
    P2(local.D, local.E, local.A, local.B, local.C,  6,  5, 10, 15);
224
0
    P2(local.C, local.D, local.E, local.A, local.B,  2, 12, 14,  8);
225
0
#undef F
226
0
#undef K
227
0
#undef Fp
228
0
#undef Kp
229
230
0
#define F   F5
231
0
#define K   0xA953FD4E
232
0
#define Fp  F1
233
0
#define Kp  0x00000000
234
0
    P2(local.B, local.C, local.D, local.E, local.A,  4,  9, 12,  8);
235
0
    P2(local.A, local.B, local.C, local.D, local.E,  0, 15, 15,  5);
236
0
    P2(local.E, local.A, local.B, local.C, local.D,  5,  5, 10, 12);
237
0
    P2(local.D, local.E, local.A, local.B, local.C,  9, 11,  4,  9);
238
0
    P2(local.C, local.D, local.E, local.A, local.B,  7,  6,  1, 12);
239
0
    P2(local.B, local.C, local.D, local.E, local.A, 12,  8,  5,  5);
240
0
    P2(local.A, local.B, local.C, local.D, local.E,  2, 13,  8, 14);
241
0
    P2(local.E, local.A, local.B, local.C, local.D, 10, 12,  7,  6);
242
0
    P2(local.D, local.E, local.A, local.B, local.C, 14,  5,  6,  8);
243
0
    P2(local.C, local.D, local.E, local.A, local.B,  1, 12,  2, 13);
244
0
    P2(local.B, local.C, local.D, local.E, local.A,  3, 13, 13,  6);
245
0
    P2(local.A, local.B, local.C, local.D, local.E,  8, 14, 14,  5);
246
0
    P2(local.E, local.A, local.B, local.C, local.D, 11, 11,  0, 15);
247
0
    P2(local.D, local.E, local.A, local.B, local.C,  6,  8,  3, 13);
248
0
    P2(local.C, local.D, local.E, local.A, local.B, 15,  5,  9, 11);
249
0
    P2(local.B, local.C, local.D, local.E, local.A, 13,  6, 11, 11);
250
0
#undef F
251
0
#undef K
252
0
#undef Fp
253
0
#undef Kp
254
255
0
    local.C       = ctx->state[1] + local.C + local.Dp;
256
0
    ctx->state[1] = ctx->state[2] + local.D + local.Ep;
257
0
    ctx->state[2] = ctx->state[3] + local.E + local.Ap;
258
0
    ctx->state[3] = ctx->state[4] + local.A + local.Bp;
259
0
    ctx->state[4] = ctx->state[0] + local.B + local.Cp;
260
0
    ctx->state[0] = local.C;
261
262
    /* Zeroise variables to clear sensitive data from memory. */
263
0
    mbedtls_platform_zeroize(&local, sizeof(local));
264
265
0
    return 0;
266
0
}
267
268
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
269
void mbedtls_ripemd160_process(mbedtls_ripemd160_context *ctx,
270
                               const unsigned char data[64])
271
0
{
272
0
    mbedtls_internal_ripemd160_process(ctx, data);
273
0
}
274
#endif
275
#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */
276
277
/*
278
 * RIPEMD-160 process buffer
279
 */
280
int mbedtls_ripemd160_update_ret(mbedtls_ripemd160_context *ctx,
281
                                 const unsigned char *input,
282
                                 size_t ilen)
283
0
{
284
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
285
0
    size_t fill;
286
0
    uint32_t left;
287
288
0
    if (ilen == 0) {
289
0
        return 0;
290
0
    }
291
292
0
    left = ctx->total[0] & 0x3F;
293
0
    fill = 64 - left;
294
295
0
    ctx->total[0] += (uint32_t) ilen;
296
0
    ctx->total[0] &= 0xFFFFFFFF;
297
298
0
    if (ctx->total[0] < (uint32_t) ilen) {
299
0
        ctx->total[1]++;
300
0
    }
301
302
0
    if (left && ilen >= fill) {
303
0
        memcpy((void *) (ctx->buffer + left), input, fill);
304
305
0
        if ((ret = mbedtls_internal_ripemd160_process(ctx, ctx->buffer)) != 0) {
306
0
            return ret;
307
0
        }
308
309
0
        input += fill;
310
0
        ilen  -= fill;
311
0
        left = 0;
312
0
    }
313
314
0
    while (ilen >= 64) {
315
0
        if ((ret = mbedtls_internal_ripemd160_process(ctx, input)) != 0) {
316
0
            return ret;
317
0
        }
318
319
0
        input += 64;
320
0
        ilen  -= 64;
321
0
    }
322
323
0
    if (ilen > 0) {
324
0
        memcpy((void *) (ctx->buffer + left), input, ilen);
325
0
    }
326
327
0
    return 0;
328
0
}
329
330
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
331
void mbedtls_ripemd160_update(mbedtls_ripemd160_context *ctx,
332
                              const unsigned char *input,
333
                              size_t ilen)
334
0
{
335
0
    mbedtls_ripemd160_update_ret(ctx, input, ilen);
336
0
}
337
#endif
338
339
static const unsigned char ripemd160_padding[64] =
340
{
341
    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
342
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
343
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
344
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
345
};
346
347
/*
348
 * RIPEMD-160 final digest
349
 */
350
int mbedtls_ripemd160_finish_ret(mbedtls_ripemd160_context *ctx,
351
                                 unsigned char output[20])
352
0
{
353
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
354
0
    uint32_t last, padn;
355
0
    uint32_t high, low;
356
0
    unsigned char msglen[8];
357
358
0
    high = (ctx->total[0] >> 29)
359
0
           | (ctx->total[1] <<  3);
360
0
    low  = (ctx->total[0] <<  3);
361
362
0
    MBEDTLS_PUT_UINT32_LE(low,  msglen, 0);
363
0
    MBEDTLS_PUT_UINT32_LE(high, msglen, 4);
364
365
0
    last = ctx->total[0] & 0x3F;
366
0
    padn = (last < 56) ? (56 - last) : (120 - last);
367
368
0
    ret = mbedtls_ripemd160_update_ret(ctx, ripemd160_padding, padn);
369
0
    if (ret != 0) {
370
0
        return ret;
371
0
    }
372
373
0
    ret = mbedtls_ripemd160_update_ret(ctx, msglen, 8);
374
0
    if (ret != 0) {
375
0
        return ret;
376
0
    }
377
378
0
    MBEDTLS_PUT_UINT32_LE(ctx->state[0], output,  0);
379
0
    MBEDTLS_PUT_UINT32_LE(ctx->state[1], output,  4);
380
0
    MBEDTLS_PUT_UINT32_LE(ctx->state[2], output,  8);
381
0
    MBEDTLS_PUT_UINT32_LE(ctx->state[3], output, 12);
382
0
    MBEDTLS_PUT_UINT32_LE(ctx->state[4], output, 16);
383
384
0
    return 0;
385
0
}
386
387
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
388
void mbedtls_ripemd160_finish(mbedtls_ripemd160_context *ctx,
389
                              unsigned char output[20])
390
0
{
391
0
    mbedtls_ripemd160_finish_ret(ctx, output);
392
0
}
393
#endif
394
395
#endif /* ! MBEDTLS_RIPEMD160_ALT */
396
397
/*
398
 * output = RIPEMD-160( input buffer )
399
 */
400
int mbedtls_ripemd160_ret(const unsigned char *input,
401
                          size_t ilen,
402
                          unsigned char output[20])
403
0
{
404
0
    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
405
0
    mbedtls_ripemd160_context ctx;
406
407
0
    mbedtls_ripemd160_init(&ctx);
408
409
0
    if ((ret = mbedtls_ripemd160_starts_ret(&ctx)) != 0) {
410
0
        goto exit;
411
0
    }
412
413
0
    if ((ret = mbedtls_ripemd160_update_ret(&ctx, input, ilen)) != 0) {
414
0
        goto exit;
415
0
    }
416
417
0
    if ((ret = mbedtls_ripemd160_finish_ret(&ctx, output)) != 0) {
418
0
        goto exit;
419
0
    }
420
421
0
exit:
422
0
    mbedtls_ripemd160_free(&ctx);
423
424
0
    return ret;
425
0
}
426
427
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
428
void mbedtls_ripemd160(const unsigned char *input,
429
                       size_t ilen,
430
                       unsigned char output[20])
431
0
{
432
0
    mbedtls_ripemd160_ret(input, ilen, output);
433
0
}
434
#endif
435
436
#if defined(MBEDTLS_SELF_TEST)
437
/*
438
 * Test vectors from the RIPEMD-160 paper and
439
 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
440
 */
441
0
#define TESTS   8
442
static const unsigned char ripemd160_test_str[TESTS][81] =
443
{
444
    { "" },
445
    { "a" },
446
    { "abc" },
447
    { "message digest" },
448
    { "abcdefghijklmnopqrstuvwxyz" },
449
    { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
450
    { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
451
    { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" },
452
};
453
454
static const size_t ripemd160_test_strlen[TESTS] =
455
{
456
    0, 1, 3, 14, 26, 56, 62, 80
457
};
458
459
static const unsigned char ripemd160_test_md[TESTS][20] =
460
{
461
    { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
462
      0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
463
    { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
464
      0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
465
    { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
466
      0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
467
    { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
468
      0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
469
    { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
470
      0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
471
    { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
472
      0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
473
    { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
474
      0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
475
    { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
476
      0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
477
};
478
479
/*
480
 * Checkup routine
481
 */
482
int mbedtls_ripemd160_self_test(int verbose)
483
0
{
484
0
    int i, ret = 0;
485
0
    unsigned char output[20];
486
487
0
    memset(output, 0, sizeof(output));
488
489
0
    for (i = 0; i < TESTS; i++) {
490
0
        if (verbose != 0) {
491
0
            mbedtls_printf("  RIPEMD-160 test #%d: ", i + 1);
492
0
        }
493
494
0
        ret = mbedtls_ripemd160_ret(ripemd160_test_str[i],
495
0
                                    ripemd160_test_strlen[i], output);
496
0
        if (ret != 0) {
497
0
            goto fail;
498
0
        }
499
500
0
        if (memcmp(output, ripemd160_test_md[i], 20) != 0) {
501
0
            ret = 1;
502
0
            goto fail;
503
0
        }
504
505
0
        if (verbose != 0) {
506
0
            mbedtls_printf("passed\n");
507
0
        }
508
0
    }
509
510
0
    if (verbose != 0) {
511
0
        mbedtls_printf("\n");
512
0
    }
513
514
0
    return 0;
515
516
0
fail:
517
0
    if (verbose != 0) {
518
0
        mbedtls_printf("failed\n");
519
0
    }
520
521
0
    return ret;
522
0
}
523
524
#endif /* MBEDTLS_SELF_TEST */
525
526
#endif /* MBEDTLS_RIPEMD160_C */