blob: ecaeea00ad53c2e31b79d3bf124b007ee8f9750d [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é-Gonnard16d412f2015-07-06 15:26:26 +020091void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,
92 const mbedtls_ripemd160_context *src )
93{
94 *dst = *src;
95}
96
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010097/*
Paul Bakker61b699e2014-01-22 13:35:29 +010098 * RIPEMD-160 context setup
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +010099 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200100void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100101{
102 ctx->total[0] = 0;
103 ctx->total[1] = 0;
104
105 ctx->state[0] = 0x67452301;
106 ctx->state[1] = 0xEFCDAB89;
107 ctx->state[2] = 0x98BADCFE;
108 ctx->state[3] = 0x10325476;
109 ctx->state[4] = 0xC3D2E1F0;
110}
111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)
Manuel Pégourié-Gonnarde4d47a62014-01-17 20:41:32 +0100113/*
114 * Process one block
115 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100117{
118 uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
119
120 GET_UINT32_LE( X[ 0], data, 0 );
121 GET_UINT32_LE( X[ 1], data, 4 );
122 GET_UINT32_LE( X[ 2], data, 8 );
123 GET_UINT32_LE( X[ 3], data, 12 );
124 GET_UINT32_LE( X[ 4], data, 16 );
125 GET_UINT32_LE( X[ 5], data, 20 );
126 GET_UINT32_LE( X[ 6], data, 24 );
127 GET_UINT32_LE( X[ 7], data, 28 );
128 GET_UINT32_LE( X[ 8], data, 32 );
129 GET_UINT32_LE( X[ 9], data, 36 );
130 GET_UINT32_LE( X[10], data, 40 );
131 GET_UINT32_LE( X[11], data, 44 );
132 GET_UINT32_LE( X[12], data, 48 );
133 GET_UINT32_LE( X[13], data, 52 );
134 GET_UINT32_LE( X[14], data, 56 );
135 GET_UINT32_LE( X[15], data, 60 );
136
137 A = Ap = ctx->state[0];
138 B = Bp = ctx->state[1];
139 C = Cp = ctx->state[2];
140 D = Dp = ctx->state[3];
141 E = Ep = ctx->state[4];
142
143#define F1( x, y, z ) ( x ^ y ^ z )
144#define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) )
145#define F3( x, y, z ) ( ( x | ~y ) ^ z )
146#define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) )
147#define F5( x, y, z ) ( x ^ ( y | ~z ) )
148
149#define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) )
150
151#define P( a, b, c, d, e, r, s, f, k ) \
152 a += f( b, c, d ) + X[r] + k; \
153 a = S( a, s ) + e; \
154 c = S( c, 10 );
155
156#define P2( a, b, c, d, e, r, s, rp, sp ) \
157 P( a, b, c, d, e, r, s, F, K ); \
158 P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp );
159
160#define F F1
161#define K 0x00000000
162#define Fp F5
163#define Kp 0x50A28BE6
164 P2( A, B, C, D, E, 0, 11, 5, 8 );
165 P2( E, A, B, C, D, 1, 14, 14, 9 );
166 P2( D, E, A, B, C, 2, 15, 7, 9 );
167 P2( C, D, E, A, B, 3, 12, 0, 11 );
168 P2( B, C, D, E, A, 4, 5, 9, 13 );
169 P2( A, B, C, D, E, 5, 8, 2, 15 );
170 P2( E, A, B, C, D, 6, 7, 11, 15 );
171 P2( D, E, A, B, C, 7, 9, 4, 5 );
172 P2( C, D, E, A, B, 8, 11, 13, 7 );
173 P2( B, C, D, E, A, 9, 13, 6, 7 );
174 P2( A, B, C, D, E, 10, 14, 15, 8 );
175 P2( E, A, B, C, D, 11, 15, 8, 11 );
176 P2( D, E, A, B, C, 12, 6, 1, 14 );
177 P2( C, D, E, A, B, 13, 7, 10, 14 );
178 P2( B, C, D, E, A, 14, 9, 3, 12 );
179 P2( A, B, C, D, E, 15, 8, 12, 6 );
180#undef F
181#undef K
182#undef Fp
183#undef Kp
184
185#define F F2
186#define K 0x5A827999
187#define Fp F4
188#define Kp 0x5C4DD124
189 P2( E, A, B, C, D, 7, 7, 6, 9 );
190 P2( D, E, A, B, C, 4, 6, 11, 13 );
191 P2( C, D, E, A, B, 13, 8, 3, 15 );
192 P2( B, C, D, E, A, 1, 13, 7, 7 );
193 P2( A, B, C, D, E, 10, 11, 0, 12 );
194 P2( E, A, B, C, D, 6, 9, 13, 8 );
195 P2( D, E, A, B, C, 15, 7, 5, 9 );
196 P2( C, D, E, A, B, 3, 15, 10, 11 );
197 P2( B, C, D, E, A, 12, 7, 14, 7 );
198 P2( A, B, C, D, E, 0, 12, 15, 7 );
199 P2( E, A, B, C, D, 9, 15, 8, 12 );
200 P2( D, E, A, B, C, 5, 9, 12, 7 );
201 P2( C, D, E, A, B, 2, 11, 4, 6 );
202 P2( B, C, D, E, A, 14, 7, 9, 15 );
203 P2( A, B, C, D, E, 11, 13, 1, 13 );
204 P2( E, A, B, C, D, 8, 12, 2, 11 );
205#undef F
206#undef K
207#undef Fp
208#undef Kp
209
210#define F F3
211#define K 0x6ED9EBA1
212#define Fp F3
213#define Kp 0x6D703EF3
214 P2( D, E, A, B, C, 3, 11, 15, 9 );
215 P2( C, D, E, A, B, 10, 13, 5, 7 );
216 P2( B, C, D, E, A, 14, 6, 1, 15 );
217 P2( A, B, C, D, E, 4, 7, 3, 11 );
218 P2( E, A, B, C, D, 9, 14, 7, 8 );
219 P2( D, E, A, B, C, 15, 9, 14, 6 );
220 P2( C, D, E, A, B, 8, 13, 6, 6 );
221 P2( B, C, D, E, A, 1, 15, 9, 14 );
222 P2( A, B, C, D, E, 2, 14, 11, 12 );
223 P2( E, A, B, C, D, 7, 8, 8, 13 );
224 P2( D, E, A, B, C, 0, 13, 12, 5 );
225 P2( C, D, E, A, B, 6, 6, 2, 14 );
226 P2( B, C, D, E, A, 13, 5, 10, 13 );
227 P2( A, B, C, D, E, 11, 12, 0, 13 );
228 P2( E, A, B, C, D, 5, 7, 4, 7 );
229 P2( D, E, A, B, C, 12, 5, 13, 5 );
230#undef F
231#undef K
232#undef Fp
233#undef Kp
234
235#define F F4
236#define K 0x8F1BBCDC
237#define Fp F2
238#define Kp 0x7A6D76E9
239 P2( C, D, E, A, B, 1, 11, 8, 15 );
240 P2( B, C, D, E, A, 9, 12, 6, 5 );
241 P2( A, B, C, D, E, 11, 14, 4, 8 );
242 P2( E, A, B, C, D, 10, 15, 1, 11 );
243 P2( D, E, A, B, C, 0, 14, 3, 14 );
244 P2( C, D, E, A, B, 8, 15, 11, 14 );
245 P2( B, C, D, E, A, 12, 9, 15, 6 );
246 P2( A, B, C, D, E, 4, 8, 0, 14 );
247 P2( E, A, B, C, D, 13, 9, 5, 6 );
248 P2( D, E, A, B, C, 3, 14, 12, 9 );
249 P2( C, D, E, A, B, 7, 5, 2, 12 );
250 P2( B, C, D, E, A, 15, 6, 13, 9 );
251 P2( A, B, C, D, E, 14, 8, 9, 12 );
252 P2( E, A, B, C, D, 5, 6, 7, 5 );
253 P2( D, E, A, B, C, 6, 5, 10, 15 );
254 P2( C, D, E, A, B, 2, 12, 14, 8 );
255#undef F
256#undef K
257#undef Fp
258#undef Kp
259
260#define F F5
261#define K 0xA953FD4E
262#define Fp F1
263#define Kp 0x00000000
264 P2( B, C, D, E, A, 4, 9, 12, 8 );
265 P2( A, B, C, D, E, 0, 15, 15, 5 );
266 P2( E, A, B, C, D, 5, 5, 10, 12 );
267 P2( D, E, A, B, C, 9, 11, 4, 9 );
268 P2( C, D, E, A, B, 7, 6, 1, 12 );
269 P2( B, C, D, E, A, 12, 8, 5, 5 );
270 P2( A, B, C, D, E, 2, 13, 8, 14 );
271 P2( E, A, B, C, D, 10, 12, 7, 6 );
272 P2( D, E, A, B, C, 14, 5, 6, 8 );
273 P2( C, D, E, A, B, 1, 12, 2, 13 );
274 P2( B, C, D, E, A, 3, 13, 13, 6 );
275 P2( A, B, C, D, E, 8, 14, 14, 5 );
276 P2( E, A, B, C, D, 11, 11, 0, 15 );
277 P2( D, E, A, B, C, 6, 8, 3, 13 );
278 P2( C, D, E, A, B, 15, 5, 9, 11 );
279 P2( B, C, D, E, A, 13, 6, 11, 11 );
280#undef F
281#undef K
282#undef Fp
283#undef Kp
284
285 C = ctx->state[1] + C + Dp;
286 ctx->state[1] = ctx->state[2] + D + Ep;
287 ctx->state[2] = ctx->state[3] + E + Ap;
288 ctx->state[3] = ctx->state[4] + A + Bp;
289 ctx->state[4] = ctx->state[0] + B + Cp;
290 ctx->state[0] = C;
291}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100293
294/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100295 * RIPEMD-160 process buffer
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100296 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,
Paul Bakker61b699e2014-01-22 13:35:29 +0100298 const unsigned char *input, size_t ilen )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100299{
300 size_t fill;
301 uint32_t left;
302
Brian White12895d12014-04-11 11:29:42 -0400303 if( ilen == 0 )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100304 return;
305
306 left = ctx->total[0] & 0x3F;
307 fill = 64 - left;
308
309 ctx->total[0] += (uint32_t) ilen;
310 ctx->total[0] &= 0xFFFFFFFF;
311
312 if( ctx->total[0] < (uint32_t) ilen )
313 ctx->total[1]++;
314
315 if( left && ilen >= fill )
316 {
317 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 mbedtls_ripemd160_process( ctx, ctx->buffer );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100319 input += fill;
320 ilen -= fill;
321 left = 0;
322 }
323
324 while( ilen >= 64 )
325 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 mbedtls_ripemd160_process( ctx, input );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100327 input += 64;
328 ilen -= 64;
329 }
330
331 if( ilen > 0 )
332 {
333 memcpy( (void *) (ctx->buffer + left), input, ilen );
334 }
335}
336
Paul Bakker61b699e2014-01-22 13:35:29 +0100337static const unsigned char ripemd160_padding[64] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100338{
339 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
340 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
341 0, 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};
344
345/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100346 * RIPEMD-160 final digest
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100347 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200348void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100349{
350 uint32_t last, padn;
351 uint32_t high, low;
352 unsigned char msglen[8];
353
354 high = ( ctx->total[0] >> 29 )
355 | ( ctx->total[1] << 3 );
356 low = ( ctx->total[0] << 3 );
357
358 PUT_UINT32_LE( low, msglen, 0 );
359 PUT_UINT32_LE( high, msglen, 4 );
360
361 last = ctx->total[0] & 0x3F;
362 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
363
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364 mbedtls_ripemd160_update( ctx, ripemd160_padding, padn );
365 mbedtls_ripemd160_update( ctx, msglen, 8 );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100366
367 PUT_UINT32_LE( ctx->state[0], output, 0 );
368 PUT_UINT32_LE( ctx->state[1], output, 4 );
369 PUT_UINT32_LE( ctx->state[2], output, 8 );
370 PUT_UINT32_LE( ctx->state[3], output, 12 );
371 PUT_UINT32_LE( ctx->state[4], output, 16 );
372}
373
374/*
Paul Bakker61b699e2014-01-22 13:35:29 +0100375 * output = RIPEMD-160( input buffer )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100376 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377void mbedtls_ripemd160( const unsigned char *input, size_t ilen,
Paul Bakker61b699e2014-01-22 13:35:29 +0100378 unsigned char output[20] )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100379{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380 mbedtls_ripemd160_context ctx;
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_ripemd160_init( &ctx );
383 mbedtls_ripemd160_starts( &ctx );
384 mbedtls_ripemd160_update( &ctx, input, ilen );
385 mbedtls_ripemd160_finish( &ctx, output );
386 mbedtls_ripemd160_free( &ctx );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100387}
388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389#if defined(MBEDTLS_SELF_TEST)
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100390/*
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100391 * Test vectors from the RIPEMD-160 paper and
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100393 */
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100394#define TESTS 8
395#define KEYS 2
Paul Bakker61b699e2014-01-22 13:35:29 +0100396static const char *ripemd160_test_input[TESTS] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100397{
398 "",
399 "a",
400 "abc",
401 "message digest",
402 "abcdefghijklmnopqrstuvwxyz",
403 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
404 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
405 "1234567890123456789012345678901234567890"
406 "1234567890123456789012345678901234567890",
407};
408
Paul Bakker61b699e2014-01-22 13:35:29 +0100409static const unsigned char ripemd160_test_md[TESTS][20] =
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100410{
411 { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
412 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
413 { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
414 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
415 { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
416 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
417 { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
418 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
419 { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
420 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
421 { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
422 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
423 { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
424 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
425 { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
426 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
427};
428
429/*
430 * Checkup routine
431 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432int mbedtls_ripemd160_self_test( int verbose )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100433{
Manuel Pégourié-Gonnard4da88c52015-03-24 18:23:20 +0100434 int i;
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100435 unsigned char output[20];
436
437 memset( output, 0, sizeof output );
438
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100439 for( i = 0; i < TESTS; i++ )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100440 {
441 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200442 mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444 mbedtls_ripemd160( (const unsigned char *) ripemd160_test_input[i],
Paul Bakker61b699e2014-01-22 13:35:29 +0100445 strlen( ripemd160_test_input[i] ),
446 output );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100447
Paul Bakker61b699e2014-01-22 13:35:29 +0100448 if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100449 {
450 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451 mbedtls_printf( "failed\n" );
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100452
453 return( 1 );
454 }
455
456 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200457 mbedtls_printf( "passed\n" );
Manuel Pégourié-Gonnardff40c3a2014-01-17 19:49:15 +0100458 }
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100459
460 return( 0 );
461}
462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200463#endif /* MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnardcab4a882014-01-17 12:42:35 +0100464
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200465#endif /* MBEDTLS_RIPEMD160_C */