blob: d8a451daf0a21f5d7a0087a522149ffbf28a1214 [file] [log] [blame]
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +01001/*
2 * RIPE MD-160 implementation
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2014-2014, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +01005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +01007 *
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +01008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22
23/*
24 * The RIPEMD-160 algorithm was designed by RIPE in 1996
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020025 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010026 * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
27 */
28
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000030#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020033#endif
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020035#if defined(MBEDTLS_RIPEMD160_C)
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010036
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/ripemd160.h"
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010038
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <string.h>
40
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_SELF_TEST)
42#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044#else
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#define mbedtls_printf printf
47#endif /* MBEDTLS_PLATFORM_C */
48#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010049
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010050/*
51 * 32-bit integer manipulation macros (little endian)
52 */
53#ifndef GET_UINT32_LE
54#define GET_UINT32_LE(n,b,i) \
55{ \
56 (n) = ( (uint32_t) (b)[(i) ] ) \
57 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
58 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
59 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
60}
61#endif
62
63#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000064#define PUT_UINT32_LE(n,b,i) \
65{ \
66 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
67 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
68 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
69 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010070}
71#endif
72
Paul Bakker34617722014-06-13 17:20:13 +020073/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020075 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
76}
77
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020079{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020081}
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020084{
85 if( ctx == NULL )
86 return;
87
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088 mbedtls_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020089}
90
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010091/*
Paul Bakker61b699e2014-01-22 13:35:29 +010092 * RIPEMD-160 context setup
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010093 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010095{
96 ctx->total[0] = 0;
97 ctx->total[1] = 0;
98
99 ctx->state[0] = 0x67452301;
100 ctx->state[1] = 0xEFCDAB89;
101 ctx->state[2] = 0x98BADCFE;
102 ctx->state[3] = 0x10325476;
103 ctx->state[4] = 0xC3D2E1F0;
104}
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100107/*
108 * Process one block
109 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100111{
112 uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
113
114 GET_UINT32_LE( X[ 0], data, 0 );
115 GET_UINT32_LE( X[ 1], data, 4 );
116 GET_UINT32_LE( X[ 2], data, 8 );
117 GET_UINT32_LE( X[ 3], data, 12 );
118 GET_UINT32_LE( X[ 4], data, 16 );
119 GET_UINT32_LE( X[ 5], data, 20 );
120 GET_UINT32_LE( X[ 6], data, 24 );
121 GET_UINT32_LE( X[ 7], data, 28 );
122 GET_UINT32_LE( X[ 8], data, 32 );
123 GET_UINT32_LE( X[ 9], data, 36 );
124 GET_UINT32_LE( X[10], data, 40 );
125 GET_UINT32_LE( X[11], data, 44 );
126 GET_UINT32_LE( X[12], data, 48 );
127 GET_UINT32_LE( X[13], data, 52 );
128 GET_UINT32_LE( X[14], data, 56 );
129 GET_UINT32_LE( X[15], data, 60 );
130
131 A = Ap = ctx->state[0];
132 B = Bp = ctx->state[1];
133 C = Cp = ctx->state[2];
134 D = Dp = ctx->state[3];
135 E = Ep = ctx->state[4];
136
137#define F1( x, y, z ) ( x ^ y ^ z )
138#define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) )
139#define F3( x, y, z ) ( ( x | ~y ) ^ z )
140#define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) )
141#define F5( x, y, z ) ( x ^ ( y | ~z ) )
142
143#define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) )
144
145#define P( a, b, c, d, e, r, s, f, k ) \
146 a += f( b, c, d ) + X[r] + k; \
147 a = S( a, s ) + e; \
148 c = S( c, 10 );
149
150#define P2( a, b, c, d, e, r, s, rp, sp ) \
151 P( a, b, c, d, e, r, s, F, K ); \
152 P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp );
153
154#define F F1
155#define K 0x00000000
156#define Fp F5
157#define Kp 0x50A28BE6
158 P2( A, B, C, D, E, 0, 11, 5, 8 );
159 P2( E, A, B, C, D, 1, 14, 14, 9 );
160 P2( D, E, A, B, C, 2, 15, 7, 9 );
161 P2( C, D, E, A, B, 3, 12, 0, 11 );
162 P2( B, C, D, E, A, 4, 5, 9, 13 );
163 P2( A, B, C, D, E, 5, 8, 2, 15 );
164 P2( E, A, B, C, D, 6, 7, 11, 15 );
165 P2( D, E, A, B, C, 7, 9, 4, 5 );
166 P2( C, D, E, A, B, 8, 11, 13, 7 );
167 P2( B, C, D, E, A, 9, 13, 6, 7 );
168 P2( A, B, C, D, E, 10, 14, 15, 8 );
169 P2( E, A, B, C, D, 11, 15, 8, 11 );
170 P2( D, E, A, B, C, 12, 6, 1, 14 );
171 P2( C, D, E, A, B, 13, 7, 10, 14 );
172 P2( B, C, D, E, A, 14, 9, 3, 12 );
173 P2( A, B, C, D, E, 15, 8, 12, 6 );
174#undef F
175#undef K
176#undef Fp
177#undef Kp
178
179#define F F2
180#define K 0x5A827999
181#define Fp F4
182#define Kp 0x5C4DD124
183 P2( E, A, B, C, D, 7, 7, 6, 9 );
184 P2( D, E, A, B, C, 4, 6, 11, 13 );
185 P2( C, D, E, A, B, 13, 8, 3, 15 );
186 P2( B, C, D, E, A, 1, 13, 7, 7 );
187 P2( A, B, C, D, E, 10, 11, 0, 12 );
188 P2( E, A, B, C, D, 6, 9, 13, 8 );
189 P2( D, E, A, B, C, 15, 7, 5, 9 );
190 P2( C, D, E, A, B, 3, 15, 10, 11 );
191 P2( B, C, D, E, A, 12, 7, 14, 7 );
192 P2( A, B, C, D, E, 0, 12, 15, 7 );
193 P2( E, A, B, C, D, 9, 15, 8, 12 );
194 P2( D, E, A, B, C, 5, 9, 12, 7 );
195 P2( C, D, E, A, B, 2, 11, 4, 6 );
196 P2( B, C, D, E, A, 14, 7, 9, 15 );
197 P2( A, B, C, D, E, 11, 13, 1, 13 );
198 P2( E, A, B, C, D, 8, 12, 2, 11 );
199#undef F
200#undef K
201#undef Fp
202#undef Kp
203
204#define F F3
205#define K 0x6ED9EBA1
206#define Fp F3
207#define Kp 0x6D703EF3
208 P2( D, E, A, B, C, 3, 11, 15, 9 );
209 P2( C, D, E, A, B, 10, 13, 5, 7 );
210 P2( B, C, D, E, A, 14, 6, 1, 15 );
211 P2( A, B, C, D, E, 4, 7, 3, 11 );
212 P2( E, A, B, C, D, 9, 14, 7, 8 );
213 P2( D, E, A, B, C, 15, 9, 14, 6 );
214 P2( C, D, E, A, B, 8, 13, 6, 6 );
215 P2( B, C, D, E, A, 1, 15, 9, 14 );
216 P2( A, B, C, D, E, 2, 14, 11, 12 );
217 P2( E, A, B, C, D, 7, 8, 8, 13 );
218 P2( D, E, A, B, C, 0, 13, 12, 5 );
219 P2( C, D, E, A, B, 6, 6, 2, 14 );
220 P2( B, C, D, E, A, 13, 5, 10, 13 );
221 P2( A, B, C, D, E, 11, 12, 0, 13 );
222 P2( E, A, B, C, D, 5, 7, 4, 7 );
223 P2( D, E, A, B, C, 12, 5, 13, 5 );
224#undef F
225#undef K
226#undef Fp
227#undef Kp
228
229#define F F4
230#define K 0x8F1BBCDC
231#define Fp F2
232#define Kp 0x7A6D76E9
233 P2( C, D, E, A, B, 1, 11, 8, 15 );
234 P2( B, C, D, E, A, 9, 12, 6, 5 );
235 P2( A, B, C, D, E, 11, 14, 4, 8 );
236 P2( E, A, B, C, D, 10, 15, 1, 11 );
237 P2( D, E, A, B, C, 0, 14, 3, 14 );
238 P2( C, D, E, A, B, 8, 15, 11, 14 );
239 P2( B, C, D, E, A, 12, 9, 15, 6 );
240 P2( A, B, C, D, E, 4, 8, 0, 14 );
241 P2( E, A, B, C, D, 13, 9, 5, 6 );
242 P2( D, E, A, B, C, 3, 14, 12, 9 );
243 P2( C, D, E, A, B, 7, 5, 2, 12 );
244 P2( B, C, D, E, A, 15, 6, 13, 9 );
245 P2( A, B, C, D, E, 14, 8, 9, 12 );
246 P2( E, A, B, C, D, 5, 6, 7, 5 );
247 P2( D, E, A, B, C, 6, 5, 10, 15 );
248 P2( C, D, E, A, B, 2, 12, 14, 8 );
249#undef F
250#undef K
251#undef Fp
252#undef Kp
253
254#define F F5
255#define K 0xA953FD4E
256#define Fp F1
257#define Kp 0x00000000
258 P2( B, C, D, E, A, 4, 9, 12, 8 );
259 P2( A, B, C, D, E, 0, 15, 15, 5 );
260 P2( E, A, B, C, D, 5, 5, 10, 12 );
261 P2( D, E, A, B, C, 9, 11, 4, 9 );
262 P2( C, D, E, A, B, 7, 6, 1, 12 );
263 P2( B, C, D, E, A, 12, 8, 5, 5 );
264 P2( A, B, C, D, E, 2, 13, 8, 14 );
265 P2( E, A, B, C, D, 10, 12, 7, 6 );
266 P2( D, E, A, B, C, 14, 5, 6, 8 );
267 P2( C, D, E, A, B, 1, 12, 2, 13 );
268 P2( B, C, D, E, A, 3, 13, 13, 6 );
269 P2( A, B, C, D, E, 8, 14, 14, 5 );
270 P2( E, A, B, C, D, 11, 11, 0, 15 );
271 P2( D, E, A, B, C, 6, 8, 3, 13 );
272 P2( C, D, E, A, B, 15, 5, 9, 11 );
273 P2( B, C, D, E, A, 13, 6, 11, 11 );
274#undef F
275#undef K
276#undef Fp
277#undef Kp
278
279 C = ctx->state[1] + C + Dp;
280 ctx->state[1] = ctx->state[2] + D + Ep;
281 ctx->state[2] = ctx->state[3] + E + Ap;
282 ctx->state[3] = ctx->state[4] + A + Bp;
283 ctx->state[4] = ctx->state[0] + B + Cp;
284 ctx->state[0] = C;
285}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100287
288/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100289 * RIPEMD-160 process buffer
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100290 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200291void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
Paul Bakker61b699e2014-01-22 13:35:29 +0100292 const unsigned char *input, size_t ilen )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100293{
294 size_t fill;
295 uint32_t left;
296
Brian White12895d12014-04-11 11:29:42 -0400297 if( ilen == 0 )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100298 return;
299
300 left = ctx->total[0] & 0x3F;
301 fill = 64 - left;
302
303 ctx->total[0] += (uint32_t) ilen;
304 ctx->total[0] &= 0xFFFFFFFF;
305
306 if( ctx->total[0] < (uint32_t) ilen )
307 ctx->total[1]++;
308
309 if( left && ilen >= fill )
310 {
311 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312 mbedtls_ripemd160_process( ctx, ctx->buffer );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100313 input += fill;
314 ilen -= fill;
315 left = 0;
316 }
317
318 while( ilen >= 64 )
319 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 mbedtls_ripemd160_process( ctx, input );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100321 input += 64;
322 ilen -= 64;
323 }
324
325 if( ilen > 0 )
326 {
327 memcpy( (void *) (ctx->buffer + left), input, ilen );
328 }
329}
330
Paul Bakker61b699e2014-01-22 13:35:29 +0100331static const unsigned char ripemd160_padding[64] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100332{
333 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
337};
338
339/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100340 * RIPEMD-160 final digest
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100341 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100343{
344 uint32_t last, padn;
345 uint32_t high, low;
346 unsigned char msglen[8];
347
348 high = ( ctx->total[0] >> 29 )
349 | ( ctx->total[1] << 3 );
350 low = ( ctx->total[0] << 3 );
351
352 PUT_UINT32_LE( low, msglen, 0 );
353 PUT_UINT32_LE( high, msglen, 4 );
354
355 last = ctx->total[0] & 0x3F;
356 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_ripemd160_update( ctx, ripemd160_padding, padn );
359 mbedtls_ripemd160_update( ctx, msglen, 8 );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100360
361 PUT_UINT32_LE( ctx->state[0], output, 0 );
362 PUT_UINT32_LE( ctx->state[1], output, 4 );
363 PUT_UINT32_LE( ctx->state[2], output, 8 );
364 PUT_UINT32_LE( ctx->state[3], output, 12 );
365 PUT_UINT32_LE( ctx->state[4], output, 16 );
366}
367
368/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100369 * output = RIPEMD-160( input buffer )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100370 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371void mbedtls_ripemd160( const unsigned char *input, size_t ilen,
Paul Bakker61b699e2014-01-22 13:35:29 +0100372 unsigned char output[20] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100373{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 mbedtls_ripemd160_context ctx;
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 mbedtls_ripemd160_init( &ctx );
377 mbedtls_ripemd160_starts( &ctx );
378 mbedtls_ripemd160_update( &ctx, input, ilen );
379 mbedtls_ripemd160_finish( &ctx, output );
380 mbedtls_ripemd160_free( &ctx );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100381}
382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#if defined(MBEDTLS_SELF_TEST)
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100384/*
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100385 * Test vectors from the RIPEMD-160 paper and
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100387 */
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100388#define TESTS 8
389#define KEYS 2
Paul Bakker61b699e2014-01-22 13:35:29 +0100390static const char *ripemd160_test_input[TESTS] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100391{
392 "",
393 "a",
394 "abc",
395 "message digest",
396 "abcdefghijklmnopqrstuvwxyz",
397 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
398 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
399 "1234567890123456789012345678901234567890"
400 "1234567890123456789012345678901234567890",
401};
402
Paul Bakker61b699e2014-01-22 13:35:29 +0100403static const unsigned char ripemd160_test_md[TESTS][20] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100404{
405 { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
406 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
407 { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
408 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
409 { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
410 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
411 { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
412 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
413 { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
414 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
415 { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
416 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
417 { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
418 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
419 { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
420 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
421};
422
423/*
424 * Checkup routine
425 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200426int mbedtls_ripemd160_self_test( int verbose )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100427{
Manuel Pégourié-Gonnard4da88c52015-03-24 18:23:20 +0100428 int i;
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100429 unsigned char output[20];
430
431 memset( output, 0, sizeof output );
432
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100433 for( i = 0; i < TESTS; i++ )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100434 {
435 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436 mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 mbedtls_ripemd160( (const unsigned char *) ripemd160_test_input[i],
Paul Bakker61b699e2014-01-22 13:35:29 +0100439 strlen( ripemd160_test_input[i] ),
440 output );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100441
Paul Bakker61b699e2014-01-22 13:35:29 +0100442 if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100443 {
444 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_printf( "failed\n" );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100446
447 return( 1 );
448 }
449
450 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451 mbedtls_printf( "passed\n" );
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100452 }
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100453
454 return( 0 );
455}
456
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457#endif /* MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459#endif /* MBEDTLS_RIPEMD160_C */