blob: 6f644ef19fc5538415c38e0c6ad05df4b30c4a96 [file] [log] [blame]
Edison Aic6672fd2018-02-28 15:01:47 +08001// SPDX-License-Identifier: Apache-2.0
Jens Wiklander817466c2018-05-22 13:49:31 +02002/*
3 * RIPE MD-160 implementation
4 *
5 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Jens Wiklander817466c2018-05-22 13:49:31 +02006 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * This file is part of mbed TLS (https://tls.mbed.org)
20 */
21
22/*
23 * The RIPEMD-160 algorithm was designed by RIPE in 1996
24 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html
25 * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
26 */
27
28#if !defined(MBEDTLS_CONFIG_FILE)
29#include "mbedtls/config.h"
30#else
31#include MBEDTLS_CONFIG_FILE
32#endif
33
34#if defined(MBEDTLS_RIPEMD160_C)
35
36#include "mbedtls/ripemd160.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010037#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020038#include "mbedtls/error.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020039
40#include <string.h>
41
42#if defined(MBEDTLS_SELF_TEST)
43#if defined(MBEDTLS_PLATFORM_C)
44#include "mbedtls/platform.h"
45#else
46#include <stdio.h>
47#define mbedtls_printf printf
48#endif /* MBEDTLS_PLATFORM_C */
49#endif /* MBEDTLS_SELF_TEST */
50
Jens Wiklander3d3b0592019-03-20 15:30:29 +010051#if !defined(MBEDTLS_RIPEMD160_ALT)
52
Jens Wiklander817466c2018-05-22 13:49:31 +020053/*
54 * 32-bit integer manipulation macros (little endian)
55 */
56#ifndef GET_UINT32_LE
57#define GET_UINT32_LE(n,b,i) \
58{ \
59 (n) = ( (uint32_t) (b)[(i) ] ) \
60 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
61 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
62 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
63}
64#endif
65
66#ifndef PUT_UINT32_LE
67#define PUT_UINT32_LE(n,b,i) \
68{ \
69 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
70 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
71 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
72 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
73}
74#endif
75
Jens Wiklander817466c2018-05-22 13:49:31 +020076void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx )
77{
78 memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) );
79}
80
81void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx )
82{
83 if( ctx == NULL )
84 return;
85
Jens Wiklander3d3b0592019-03-20 15:30:29 +010086 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) );
Jens Wiklander817466c2018-05-22 13:49:31 +020087}
88
89void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,
90 const mbedtls_ripemd160_context *src )
91{
92 *dst = *src;
93}
94
95/*
96 * RIPEMD-160 context setup
97 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +010098int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx )
Jens Wiklander817466c2018-05-22 13:49:31 +020099{
100 ctx->total[0] = 0;
101 ctx->total[1] = 0;
102
103 ctx->state[0] = 0x67452301;
104 ctx->state[1] = 0xEFCDAB89;
105 ctx->state[2] = 0x98BADCFE;
106 ctx->state[3] = 0x10325476;
107 ctx->state[4] = 0xC3D2E1F0;
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100108
109 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200110}
111
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100112#if !defined(MBEDTLS_DEPRECATED_REMOVED)
113void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
114{
115 mbedtls_ripemd160_starts_ret( ctx );
116}
117#endif
118
Jens Wiklander817466c2018-05-22 13:49:31 +0200119#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
120/*
121 * Process one block
122 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100123int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx,
124 const unsigned char data[64] )
Jens Wiklander817466c2018-05-22 13:49:31 +0200125{
126 uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
127
128 GET_UINT32_LE( X[ 0], data, 0 );
129 GET_UINT32_LE( X[ 1], data, 4 );
130 GET_UINT32_LE( X[ 2], data, 8 );
131 GET_UINT32_LE( X[ 3], data, 12 );
132 GET_UINT32_LE( X[ 4], data, 16 );
133 GET_UINT32_LE( X[ 5], data, 20 );
134 GET_UINT32_LE( X[ 6], data, 24 );
135 GET_UINT32_LE( X[ 7], data, 28 );
136 GET_UINT32_LE( X[ 8], data, 32 );
137 GET_UINT32_LE( X[ 9], data, 36 );
138 GET_UINT32_LE( X[10], data, 40 );
139 GET_UINT32_LE( X[11], data, 44 );
140 GET_UINT32_LE( X[12], data, 48 );
141 GET_UINT32_LE( X[13], data, 52 );
142 GET_UINT32_LE( X[14], data, 56 );
143 GET_UINT32_LE( X[15], data, 60 );
144
145 A = Ap = ctx->state[0];
146 B = Bp = ctx->state[1];
147 C = Cp = ctx->state[2];
148 D = Dp = ctx->state[3];
149 E = Ep = ctx->state[4];
150
Jerome Forissier5b25c762020-04-07 11:18:49 +0200151#define F1( x, y, z ) ( (x) ^ (y) ^ (z) )
152#define F2( x, y, z ) ( ( (x) & (y) ) | ( ~(x) & (z) ) )
153#define F3( x, y, z ) ( ( (x) | ~(y) ) ^ (z) )
154#define F4( x, y, z ) ( ( (x) & (z) ) | ( (y) & ~(z) ) )
155#define F5( x, y, z ) ( (x) ^ ( (y) | ~(z) ) )
Jens Wiklander817466c2018-05-22 13:49:31 +0200156
Jerome Forissier5b25c762020-04-07 11:18:49 +0200157#define S( x, n ) ( ( (x) << (n) ) | ( (x) >> (32 - (n)) ) )
Jens Wiklander817466c2018-05-22 13:49:31 +0200158
Jerome Forissier5b25c762020-04-07 11:18:49 +0200159#define P( a, b, c, d, e, r, s, f, k ) \
160 do \
161 { \
162 (a) += f( (b), (c), (d) ) + X[r] + (k); \
163 (a) = S( (a), (s) ) + (e); \
164 (c) = S( (c), 10 ); \
165 } while( 0 )
Jens Wiklander817466c2018-05-22 13:49:31 +0200166
Jerome Forissier5b25c762020-04-07 11:18:49 +0200167#define P2( a, b, c, d, e, r, s, rp, sp ) \
168 do \
169 { \
170 P( (a), (b), (c), (d), (e), (r), (s), F, K ); \
171 P( a ## p, b ## p, c ## p, d ## p, e ## p, \
172 (rp), (sp), Fp, Kp ); \
173 } while( 0 )
Jens Wiklander817466c2018-05-22 13:49:31 +0200174
175#define F F1
176#define K 0x00000000
177#define Fp F5
178#define Kp 0x50A28BE6
179 P2( A, B, C, D, E, 0, 11, 5, 8 );
180 P2( E, A, B, C, D, 1, 14, 14, 9 );
181 P2( D, E, A, B, C, 2, 15, 7, 9 );
182 P2( C, D, E, A, B, 3, 12, 0, 11 );
183 P2( B, C, D, E, A, 4, 5, 9, 13 );
184 P2( A, B, C, D, E, 5, 8, 2, 15 );
185 P2( E, A, B, C, D, 6, 7, 11, 15 );
186 P2( D, E, A, B, C, 7, 9, 4, 5 );
187 P2( C, D, E, A, B, 8, 11, 13, 7 );
188 P2( B, C, D, E, A, 9, 13, 6, 7 );
189 P2( A, B, C, D, E, 10, 14, 15, 8 );
190 P2( E, A, B, C, D, 11, 15, 8, 11 );
191 P2( D, E, A, B, C, 12, 6, 1, 14 );
192 P2( C, D, E, A, B, 13, 7, 10, 14 );
193 P2( B, C, D, E, A, 14, 9, 3, 12 );
194 P2( A, B, C, D, E, 15, 8, 12, 6 );
195#undef F
196#undef K
197#undef Fp
198#undef Kp
199
200#define F F2
201#define K 0x5A827999
202#define Fp F4
203#define Kp 0x5C4DD124
204 P2( E, A, B, C, D, 7, 7, 6, 9 );
205 P2( D, E, A, B, C, 4, 6, 11, 13 );
206 P2( C, D, E, A, B, 13, 8, 3, 15 );
207 P2( B, C, D, E, A, 1, 13, 7, 7 );
208 P2( A, B, C, D, E, 10, 11, 0, 12 );
209 P2( E, A, B, C, D, 6, 9, 13, 8 );
210 P2( D, E, A, B, C, 15, 7, 5, 9 );
211 P2( C, D, E, A, B, 3, 15, 10, 11 );
212 P2( B, C, D, E, A, 12, 7, 14, 7 );
213 P2( A, B, C, D, E, 0, 12, 15, 7 );
214 P2( E, A, B, C, D, 9, 15, 8, 12 );
215 P2( D, E, A, B, C, 5, 9, 12, 7 );
216 P2( C, D, E, A, B, 2, 11, 4, 6 );
217 P2( B, C, D, E, A, 14, 7, 9, 15 );
218 P2( A, B, C, D, E, 11, 13, 1, 13 );
219 P2( E, A, B, C, D, 8, 12, 2, 11 );
220#undef F
221#undef K
222#undef Fp
223#undef Kp
224
225#define F F3
226#define K 0x6ED9EBA1
227#define Fp F3
228#define Kp 0x6D703EF3
229 P2( D, E, A, B, C, 3, 11, 15, 9 );
230 P2( C, D, E, A, B, 10, 13, 5, 7 );
231 P2( B, C, D, E, A, 14, 6, 1, 15 );
232 P2( A, B, C, D, E, 4, 7, 3, 11 );
233 P2( E, A, B, C, D, 9, 14, 7, 8 );
234 P2( D, E, A, B, C, 15, 9, 14, 6 );
235 P2( C, D, E, A, B, 8, 13, 6, 6 );
236 P2( B, C, D, E, A, 1, 15, 9, 14 );
237 P2( A, B, C, D, E, 2, 14, 11, 12 );
238 P2( E, A, B, C, D, 7, 8, 8, 13 );
239 P2( D, E, A, B, C, 0, 13, 12, 5 );
240 P2( C, D, E, A, B, 6, 6, 2, 14 );
241 P2( B, C, D, E, A, 13, 5, 10, 13 );
242 P2( A, B, C, D, E, 11, 12, 0, 13 );
243 P2( E, A, B, C, D, 5, 7, 4, 7 );
244 P2( D, E, A, B, C, 12, 5, 13, 5 );
245#undef F
246#undef K
247#undef Fp
248#undef Kp
249
250#define F F4
251#define K 0x8F1BBCDC
252#define Fp F2
253#define Kp 0x7A6D76E9
254 P2( C, D, E, A, B, 1, 11, 8, 15 );
255 P2( B, C, D, E, A, 9, 12, 6, 5 );
256 P2( A, B, C, D, E, 11, 14, 4, 8 );
257 P2( E, A, B, C, D, 10, 15, 1, 11 );
258 P2( D, E, A, B, C, 0, 14, 3, 14 );
259 P2( C, D, E, A, B, 8, 15, 11, 14 );
260 P2( B, C, D, E, A, 12, 9, 15, 6 );
261 P2( A, B, C, D, E, 4, 8, 0, 14 );
262 P2( E, A, B, C, D, 13, 9, 5, 6 );
263 P2( D, E, A, B, C, 3, 14, 12, 9 );
264 P2( C, D, E, A, B, 7, 5, 2, 12 );
265 P2( B, C, D, E, A, 15, 6, 13, 9 );
266 P2( A, B, C, D, E, 14, 8, 9, 12 );
267 P2( E, A, B, C, D, 5, 6, 7, 5 );
268 P2( D, E, A, B, C, 6, 5, 10, 15 );
269 P2( C, D, E, A, B, 2, 12, 14, 8 );
270#undef F
271#undef K
272#undef Fp
273#undef Kp
274
275#define F F5
276#define K 0xA953FD4E
277#define Fp F1
278#define Kp 0x00000000
279 P2( B, C, D, E, A, 4, 9, 12, 8 );
280 P2( A, B, C, D, E, 0, 15, 15, 5 );
281 P2( E, A, B, C, D, 5, 5, 10, 12 );
282 P2( D, E, A, B, C, 9, 11, 4, 9 );
283 P2( C, D, E, A, B, 7, 6, 1, 12 );
284 P2( B, C, D, E, A, 12, 8, 5, 5 );
285 P2( A, B, C, D, E, 2, 13, 8, 14 );
286 P2( E, A, B, C, D, 10, 12, 7, 6 );
287 P2( D, E, A, B, C, 14, 5, 6, 8 );
288 P2( C, D, E, A, B, 1, 12, 2, 13 );
289 P2( B, C, D, E, A, 3, 13, 13, 6 );
290 P2( A, B, C, D, E, 8, 14, 14, 5 );
291 P2( E, A, B, C, D, 11, 11, 0, 15 );
292 P2( D, E, A, B, C, 6, 8, 3, 13 );
293 P2( C, D, E, A, B, 15, 5, 9, 11 );
294 P2( B, C, D, E, A, 13, 6, 11, 11 );
295#undef F
296#undef K
297#undef Fp
298#undef Kp
299
300 C = ctx->state[1] + C + Dp;
301 ctx->state[1] = ctx->state[2] + D + Ep;
302 ctx->state[2] = ctx->state[3] + E + Ap;
303 ctx->state[3] = ctx->state[4] + A + Bp;
304 ctx->state[4] = ctx->state[0] + B + Cp;
305 ctx->state[0] = C;
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100306
307 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200308}
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100309
310#if !defined(MBEDTLS_DEPRECATED_REMOVED)
311void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx,
312 const unsigned char data[64] )
313{
314 mbedtls_internal_ripemd160_process( ctx, data );
315}
316#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200317#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */
318
319/*
320 * RIPEMD-160 process buffer
321 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100322int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx,
323 const unsigned char *input,
324 size_t ilen )
Jens Wiklander817466c2018-05-22 13:49:31 +0200325{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200326 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200327 size_t fill;
328 uint32_t left;
329
330 if( ilen == 0 )
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100331 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200332
333 left = ctx->total[0] & 0x3F;
334 fill = 64 - left;
335
336 ctx->total[0] += (uint32_t) ilen;
337 ctx->total[0] &= 0xFFFFFFFF;
338
339 if( ctx->total[0] < (uint32_t) ilen )
340 ctx->total[1]++;
341
342 if( left && ilen >= fill )
343 {
344 memcpy( (void *) (ctx->buffer + left), input, fill );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100345
346 if( ( ret = mbedtls_internal_ripemd160_process( ctx, ctx->buffer ) ) != 0 )
347 return( ret );
348
Jens Wiklander817466c2018-05-22 13:49:31 +0200349 input += fill;
350 ilen -= fill;
351 left = 0;
352 }
353
354 while( ilen >= 64 )
355 {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100356 if( ( ret = mbedtls_internal_ripemd160_process( ctx, input ) ) != 0 )
357 return( ret );
358
Jens Wiklander817466c2018-05-22 13:49:31 +0200359 input += 64;
360 ilen -= 64;
361 }
362
363 if( ilen > 0 )
364 {
365 memcpy( (void *) (ctx->buffer + left), input, ilen );
366 }
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100367
368 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200369}
370
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100371#if !defined(MBEDTLS_DEPRECATED_REMOVED)
372void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
373 const unsigned char *input,
374 size_t ilen )
375{
376 mbedtls_ripemd160_update_ret( ctx, input, ilen );
377}
378#endif
379
Jens Wiklander817466c2018-05-22 13:49:31 +0200380static const unsigned char ripemd160_padding[64] =
381{
382 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
384 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
385 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
386};
387
388/*
389 * RIPEMD-160 final digest
390 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100391int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx,
392 unsigned char output[20] )
Jens Wiklander817466c2018-05-22 13:49:31 +0200393{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200394 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200395 uint32_t last, padn;
396 uint32_t high, low;
397 unsigned char msglen[8];
398
399 high = ( ctx->total[0] >> 29 )
400 | ( ctx->total[1] << 3 );
401 low = ( ctx->total[0] << 3 );
402
403 PUT_UINT32_LE( low, msglen, 0 );
404 PUT_UINT32_LE( high, msglen, 4 );
405
406 last = ctx->total[0] & 0x3F;
407 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
408
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100409 ret = mbedtls_ripemd160_update_ret( ctx, ripemd160_padding, padn );
410 if( ret != 0 )
411 return( ret );
412
413 ret = mbedtls_ripemd160_update_ret( ctx, msglen, 8 );
414 if( ret != 0 )
415 return( ret );
Jens Wiklander817466c2018-05-22 13:49:31 +0200416
417 PUT_UINT32_LE( ctx->state[0], output, 0 );
418 PUT_UINT32_LE( ctx->state[1], output, 4 );
419 PUT_UINT32_LE( ctx->state[2], output, 8 );
420 PUT_UINT32_LE( ctx->state[3], output, 12 );
421 PUT_UINT32_LE( ctx->state[4], output, 16 );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100422
423 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200424}
425
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100426#if !defined(MBEDTLS_DEPRECATED_REMOVED)
427void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx,
428 unsigned char output[20] )
429{
430 mbedtls_ripemd160_finish_ret( ctx, output );
431}
432#endif
433
434#endif /* ! MBEDTLS_RIPEMD160_ALT */
435
Jens Wiklander817466c2018-05-22 13:49:31 +0200436/*
437 * output = RIPEMD-160( input buffer )
438 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100439int mbedtls_ripemd160_ret( const unsigned char *input,
440 size_t ilen,
441 unsigned char output[20] )
Jens Wiklander817466c2018-05-22 13:49:31 +0200442{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200443 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200444 mbedtls_ripemd160_context ctx;
445
446 mbedtls_ripemd160_init( &ctx );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100447
448 if( ( ret = mbedtls_ripemd160_starts_ret( &ctx ) ) != 0 )
449 goto exit;
450
451 if( ( ret = mbedtls_ripemd160_update_ret( &ctx, input, ilen ) ) != 0 )
452 goto exit;
453
454 if( ( ret = mbedtls_ripemd160_finish_ret( &ctx, output ) ) != 0 )
455 goto exit;
456
457exit:
Jens Wiklander817466c2018-05-22 13:49:31 +0200458 mbedtls_ripemd160_free( &ctx );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100459
460 return( ret );
Jens Wiklander817466c2018-05-22 13:49:31 +0200461}
462
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100463#if !defined(MBEDTLS_DEPRECATED_REMOVED)
464void mbedtls_ripemd160( const unsigned char *input,
465 size_t ilen,
466 unsigned char output[20] )
467{
468 mbedtls_ripemd160_ret( input, ilen, output );
469}
470#endif
471
Jens Wiklander817466c2018-05-22 13:49:31 +0200472#if defined(MBEDTLS_SELF_TEST)
473/*
474 * Test vectors from the RIPEMD-160 paper and
475 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
476 */
477#define TESTS 8
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100478static const unsigned char ripemd160_test_str[TESTS][81] =
Jens Wiklander817466c2018-05-22 13:49:31 +0200479{
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100480 { "" },
481 { "a" },
482 { "abc" },
483 { "message digest" },
484 { "abcdefghijklmnopqrstuvwxyz" },
485 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
486 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Guido Vranken36905f92021-04-22 14:47:51 +0200487 { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" },
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100488};
489
490static const size_t ripemd160_test_strlen[TESTS] =
491{
492 0, 1, 3, 14, 26, 56, 62, 80
Jens Wiklander817466c2018-05-22 13:49:31 +0200493};
494
495static const unsigned char ripemd160_test_md[TESTS][20] =
496{
497 { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
498 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
499 { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
500 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
501 { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
502 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
503 { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
504 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
505 { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
506 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
507 { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
508 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
509 { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
510 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
511 { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
512 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
513};
514
515/*
516 * Checkup routine
517 */
518int mbedtls_ripemd160_self_test( int verbose )
519{
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100520 int i, ret = 0;
Jens Wiklander817466c2018-05-22 13:49:31 +0200521 unsigned char output[20];
522
523 memset( output, 0, sizeof output );
524
525 for( i = 0; i < TESTS; i++ )
526 {
527 if( verbose != 0 )
528 mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 );
529
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100530 ret = mbedtls_ripemd160_ret( ripemd160_test_str[i],
531 ripemd160_test_strlen[i], output );
532 if( ret != 0 )
533 goto fail;
Jens Wiklander817466c2018-05-22 13:49:31 +0200534
535 if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
536 {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100537 ret = 1;
538 goto fail;
Jens Wiklander817466c2018-05-22 13:49:31 +0200539 }
540
541 if( verbose != 0 )
542 mbedtls_printf( "passed\n" );
543 }
544
545 if( verbose != 0 )
546 mbedtls_printf( "\n" );
547
548 return( 0 );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100549
550fail:
551 if( verbose != 0 )
552 mbedtls_printf( "failed\n" );
553
554 return( ret );
Jens Wiklander817466c2018-05-22 13:49:31 +0200555}
556
557#endif /* MBEDTLS_SELF_TEST */
558
559#endif /* MBEDTLS_RIPEMD160_C */