Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
0:50cedd586816
Removed some debug.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 /*
dflet 0:50cedd586816 2 * RIPE MD-160 implementation
dflet 0:50cedd586816 3 *
dflet 0:50cedd586816 4 * Copyright (C) 2014-2014, ARM Limited, All Rights Reserved
dflet 0:50cedd586816 5 *
dflet 0:50cedd586816 6 * This file is part of mbed TLS (https://tls.mbed.org)
dflet 0:50cedd586816 7 *
dflet 0:50cedd586816 8 * This program is free software; you can redistribute it and/or modify
dflet 0:50cedd586816 9 * it under the terms of the GNU General Public License as published by
dflet 0:50cedd586816 10 * the Free Software Foundation; either version 2 of the License, or
dflet 0:50cedd586816 11 * (at your option) any later version.
dflet 0:50cedd586816 12 *
dflet 0:50cedd586816 13 * This program is distributed in the hope that it will be useful,
dflet 0:50cedd586816 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dflet 0:50cedd586816 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dflet 0:50cedd586816 16 * GNU General Public License for more details.
dflet 0:50cedd586816 17 *
dflet 0:50cedd586816 18 * You should have received a copy of the GNU General Public License along
dflet 0:50cedd586816 19 * with this program; if not, write to the Free Software Foundation, Inc.,
dflet 0:50cedd586816 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
dflet 0:50cedd586816 21 */
dflet 0:50cedd586816 22
dflet 0:50cedd586816 23 /*
dflet 0:50cedd586816 24 * The RIPEMD-160 algorithm was designed by RIPE in 1996
dflet 0:50cedd586816 25 * http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
dflet 0:50cedd586816 26 * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160
dflet 0:50cedd586816 27 */
dflet 0:50cedd586816 28
dflet 0:50cedd586816 29 #if !defined(POLARSSL_CONFIG_FILE)
dflet 0:50cedd586816 30 #include "polarssl/config.h"
dflet 0:50cedd586816 31 #else
dflet 0:50cedd586816 32 #include POLARSSL_CONFIG_FILE
dflet 0:50cedd586816 33 #endif
dflet 0:50cedd586816 34
dflet 0:50cedd586816 35 #if defined(POLARSSL_RIPEMD160_C)
dflet 0:50cedd586816 36
dflet 0:50cedd586816 37 #include "polarssl/ripemd160.h"
dflet 0:50cedd586816 38
dflet 0:50cedd586816 39 #include <string.h>
dflet 0:50cedd586816 40
dflet 0:50cedd586816 41 #if defined(POLARSSL_FS_IO)
dflet 0:50cedd586816 42 #include <stdio.h>
dflet 0:50cedd586816 43 #endif
dflet 0:50cedd586816 44
dflet 0:50cedd586816 45 #if defined(POLARSSL_SELF_TEST)
dflet 0:50cedd586816 46 #if defined(POLARSSL_PLATFORM_C)
dflet 0:50cedd586816 47 #include "polarssl/platform.h"
dflet 0:50cedd586816 48 #else
dflet 0:50cedd586816 49 #include <stdio.h>
dflet 0:50cedd586816 50 #define polarssl_printf printf
dflet 0:50cedd586816 51 #endif /* POLARSSL_PLATFORM_C */
dflet 0:50cedd586816 52 #endif /* POLARSSL_SELF_TEST */
dflet 0:50cedd586816 53
dflet 0:50cedd586816 54 /*
dflet 0:50cedd586816 55 * 32-bit integer manipulation macros (little endian)
dflet 0:50cedd586816 56 */
dflet 0:50cedd586816 57 #ifndef GET_UINT32_LE
dflet 0:50cedd586816 58 #define GET_UINT32_LE(n,b,i) \
dflet 0:50cedd586816 59 { \
dflet 0:50cedd586816 60 (n) = ( (uint32_t) (b)[(i) ] ) \
dflet 0:50cedd586816 61 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
dflet 0:50cedd586816 62 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
dflet 0:50cedd586816 63 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
dflet 0:50cedd586816 64 }
dflet 0:50cedd586816 65 #endif
dflet 0:50cedd586816 66
dflet 0:50cedd586816 67 #ifndef PUT_UINT32_LE
dflet 0:50cedd586816 68 #define PUT_UINT32_LE(n,b,i) \
dflet 0:50cedd586816 69 { \
dflet 0:50cedd586816 70 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
dflet 0:50cedd586816 71 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
dflet 0:50cedd586816 72 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
dflet 0:50cedd586816 73 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
dflet 0:50cedd586816 74 }
dflet 0:50cedd586816 75 #endif
dflet 0:50cedd586816 76
dflet 0:50cedd586816 77 /* Implementation that should never be optimized out by the compiler */
dflet 0:50cedd586816 78 static void polarssl_zeroize( void *v, size_t n ) {
dflet 0:50cedd586816 79 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
dflet 0:50cedd586816 80 }
dflet 0:50cedd586816 81
dflet 0:50cedd586816 82 void ripemd160_init( ripemd160_context *ctx )
dflet 0:50cedd586816 83 {
dflet 0:50cedd586816 84 memset( ctx, 0, sizeof( ripemd160_context ) );
dflet 0:50cedd586816 85 }
dflet 0:50cedd586816 86
dflet 0:50cedd586816 87 void ripemd160_free( ripemd160_context *ctx )
dflet 0:50cedd586816 88 {
dflet 0:50cedd586816 89 if( ctx == NULL )
dflet 0:50cedd586816 90 return;
dflet 0:50cedd586816 91
dflet 0:50cedd586816 92 polarssl_zeroize( ctx, sizeof( ripemd160_context ) );
dflet 0:50cedd586816 93 }
dflet 0:50cedd586816 94
dflet 0:50cedd586816 95 /*
dflet 0:50cedd586816 96 * RIPEMD-160 context setup
dflet 0:50cedd586816 97 */
dflet 0:50cedd586816 98 void ripemd160_starts( ripemd160_context *ctx )
dflet 0:50cedd586816 99 {
dflet 0:50cedd586816 100 ctx->total[0] = 0;
dflet 0:50cedd586816 101 ctx->total[1] = 0;
dflet 0:50cedd586816 102
dflet 0:50cedd586816 103 ctx->state[0] = 0x67452301;
dflet 0:50cedd586816 104 ctx->state[1] = 0xEFCDAB89;
dflet 0:50cedd586816 105 ctx->state[2] = 0x98BADCFE;
dflet 0:50cedd586816 106 ctx->state[3] = 0x10325476;
dflet 0:50cedd586816 107 ctx->state[4] = 0xC3D2E1F0;
dflet 0:50cedd586816 108 }
dflet 0:50cedd586816 109
dflet 0:50cedd586816 110 /*
dflet 0:50cedd586816 111 * Process one block
dflet 0:50cedd586816 112 */
dflet 0:50cedd586816 113 void ripemd160_process( ripemd160_context *ctx, const unsigned char data[64] )
dflet 0:50cedd586816 114 {
dflet 0:50cedd586816 115 uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];
dflet 0:50cedd586816 116
dflet 0:50cedd586816 117 GET_UINT32_LE( X[ 0], data, 0 );
dflet 0:50cedd586816 118 GET_UINT32_LE( X[ 1], data, 4 );
dflet 0:50cedd586816 119 GET_UINT32_LE( X[ 2], data, 8 );
dflet 0:50cedd586816 120 GET_UINT32_LE( X[ 3], data, 12 );
dflet 0:50cedd586816 121 GET_UINT32_LE( X[ 4], data, 16 );
dflet 0:50cedd586816 122 GET_UINT32_LE( X[ 5], data, 20 );
dflet 0:50cedd586816 123 GET_UINT32_LE( X[ 6], data, 24 );
dflet 0:50cedd586816 124 GET_UINT32_LE( X[ 7], data, 28 );
dflet 0:50cedd586816 125 GET_UINT32_LE( X[ 8], data, 32 );
dflet 0:50cedd586816 126 GET_UINT32_LE( X[ 9], data, 36 );
dflet 0:50cedd586816 127 GET_UINT32_LE( X[10], data, 40 );
dflet 0:50cedd586816 128 GET_UINT32_LE( X[11], data, 44 );
dflet 0:50cedd586816 129 GET_UINT32_LE( X[12], data, 48 );
dflet 0:50cedd586816 130 GET_UINT32_LE( X[13], data, 52 );
dflet 0:50cedd586816 131 GET_UINT32_LE( X[14], data, 56 );
dflet 0:50cedd586816 132 GET_UINT32_LE( X[15], data, 60 );
dflet 0:50cedd586816 133
dflet 0:50cedd586816 134 A = Ap = ctx->state[0];
dflet 0:50cedd586816 135 B = Bp = ctx->state[1];
dflet 0:50cedd586816 136 C = Cp = ctx->state[2];
dflet 0:50cedd586816 137 D = Dp = ctx->state[3];
dflet 0:50cedd586816 138 E = Ep = ctx->state[4];
dflet 0:50cedd586816 139
dflet 0:50cedd586816 140 #define F1( x, y, z ) ( x ^ y ^ z )
dflet 0:50cedd586816 141 #define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) )
dflet 0:50cedd586816 142 #define F3( x, y, z ) ( ( x | ~y ) ^ z )
dflet 0:50cedd586816 143 #define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) )
dflet 0:50cedd586816 144 #define F5( x, y, z ) ( x ^ ( y | ~z ) )
dflet 0:50cedd586816 145
dflet 0:50cedd586816 146 #define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) )
dflet 0:50cedd586816 147
dflet 0:50cedd586816 148 #define P( a, b, c, d, e, r, s, f, k ) \
dflet 0:50cedd586816 149 a += f( b, c, d ) + X[r] + k; \
dflet 0:50cedd586816 150 a = S( a, s ) + e; \
dflet 0:50cedd586816 151 c = S( c, 10 );
dflet 0:50cedd586816 152
dflet 0:50cedd586816 153 #define P2( a, b, c, d, e, r, s, rp, sp ) \
dflet 0:50cedd586816 154 P( a, b, c, d, e, r, s, F, K ); \
dflet 0:50cedd586816 155 P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp );
dflet 0:50cedd586816 156
dflet 0:50cedd586816 157 #define F F1
dflet 0:50cedd586816 158 #define K 0x00000000
dflet 0:50cedd586816 159 #define Fp F5
dflet 0:50cedd586816 160 #define Kp 0x50A28BE6
dflet 0:50cedd586816 161 P2( A, B, C, D, E, 0, 11, 5, 8 );
dflet 0:50cedd586816 162 P2( E, A, B, C, D, 1, 14, 14, 9 );
dflet 0:50cedd586816 163 P2( D, E, A, B, C, 2, 15, 7, 9 );
dflet 0:50cedd586816 164 P2( C, D, E, A, B, 3, 12, 0, 11 );
dflet 0:50cedd586816 165 P2( B, C, D, E, A, 4, 5, 9, 13 );
dflet 0:50cedd586816 166 P2( A, B, C, D, E, 5, 8, 2, 15 );
dflet 0:50cedd586816 167 P2( E, A, B, C, D, 6, 7, 11, 15 );
dflet 0:50cedd586816 168 P2( D, E, A, B, C, 7, 9, 4, 5 );
dflet 0:50cedd586816 169 P2( C, D, E, A, B, 8, 11, 13, 7 );
dflet 0:50cedd586816 170 P2( B, C, D, E, A, 9, 13, 6, 7 );
dflet 0:50cedd586816 171 P2( A, B, C, D, E, 10, 14, 15, 8 );
dflet 0:50cedd586816 172 P2( E, A, B, C, D, 11, 15, 8, 11 );
dflet 0:50cedd586816 173 P2( D, E, A, B, C, 12, 6, 1, 14 );
dflet 0:50cedd586816 174 P2( C, D, E, A, B, 13, 7, 10, 14 );
dflet 0:50cedd586816 175 P2( B, C, D, E, A, 14, 9, 3, 12 );
dflet 0:50cedd586816 176 P2( A, B, C, D, E, 15, 8, 12, 6 );
dflet 0:50cedd586816 177 #undef F
dflet 0:50cedd586816 178 #undef K
dflet 0:50cedd586816 179 #undef Fp
dflet 0:50cedd586816 180 #undef Kp
dflet 0:50cedd586816 181
dflet 0:50cedd586816 182 #define F F2
dflet 0:50cedd586816 183 #define K 0x5A827999
dflet 0:50cedd586816 184 #define Fp F4
dflet 0:50cedd586816 185 #define Kp 0x5C4DD124
dflet 0:50cedd586816 186 P2( E, A, B, C, D, 7, 7, 6, 9 );
dflet 0:50cedd586816 187 P2( D, E, A, B, C, 4, 6, 11, 13 );
dflet 0:50cedd586816 188 P2( C, D, E, A, B, 13, 8, 3, 15 );
dflet 0:50cedd586816 189 P2( B, C, D, E, A, 1, 13, 7, 7 );
dflet 0:50cedd586816 190 P2( A, B, C, D, E, 10, 11, 0, 12 );
dflet 0:50cedd586816 191 P2( E, A, B, C, D, 6, 9, 13, 8 );
dflet 0:50cedd586816 192 P2( D, E, A, B, C, 15, 7, 5, 9 );
dflet 0:50cedd586816 193 P2( C, D, E, A, B, 3, 15, 10, 11 );
dflet 0:50cedd586816 194 P2( B, C, D, E, A, 12, 7, 14, 7 );
dflet 0:50cedd586816 195 P2( A, B, C, D, E, 0, 12, 15, 7 );
dflet 0:50cedd586816 196 P2( E, A, B, C, D, 9, 15, 8, 12 );
dflet 0:50cedd586816 197 P2( D, E, A, B, C, 5, 9, 12, 7 );
dflet 0:50cedd586816 198 P2( C, D, E, A, B, 2, 11, 4, 6 );
dflet 0:50cedd586816 199 P2( B, C, D, E, A, 14, 7, 9, 15 );
dflet 0:50cedd586816 200 P2( A, B, C, D, E, 11, 13, 1, 13 );
dflet 0:50cedd586816 201 P2( E, A, B, C, D, 8, 12, 2, 11 );
dflet 0:50cedd586816 202 #undef F
dflet 0:50cedd586816 203 #undef K
dflet 0:50cedd586816 204 #undef Fp
dflet 0:50cedd586816 205 #undef Kp
dflet 0:50cedd586816 206
dflet 0:50cedd586816 207 #define F F3
dflet 0:50cedd586816 208 #define K 0x6ED9EBA1
dflet 0:50cedd586816 209 #define Fp F3
dflet 0:50cedd586816 210 #define Kp 0x6D703EF3
dflet 0:50cedd586816 211 P2( D, E, A, B, C, 3, 11, 15, 9 );
dflet 0:50cedd586816 212 P2( C, D, E, A, B, 10, 13, 5, 7 );
dflet 0:50cedd586816 213 P2( B, C, D, E, A, 14, 6, 1, 15 );
dflet 0:50cedd586816 214 P2( A, B, C, D, E, 4, 7, 3, 11 );
dflet 0:50cedd586816 215 P2( E, A, B, C, D, 9, 14, 7, 8 );
dflet 0:50cedd586816 216 P2( D, E, A, B, C, 15, 9, 14, 6 );
dflet 0:50cedd586816 217 P2( C, D, E, A, B, 8, 13, 6, 6 );
dflet 0:50cedd586816 218 P2( B, C, D, E, A, 1, 15, 9, 14 );
dflet 0:50cedd586816 219 P2( A, B, C, D, E, 2, 14, 11, 12 );
dflet 0:50cedd586816 220 P2( E, A, B, C, D, 7, 8, 8, 13 );
dflet 0:50cedd586816 221 P2( D, E, A, B, C, 0, 13, 12, 5 );
dflet 0:50cedd586816 222 P2( C, D, E, A, B, 6, 6, 2, 14 );
dflet 0:50cedd586816 223 P2( B, C, D, E, A, 13, 5, 10, 13 );
dflet 0:50cedd586816 224 P2( A, B, C, D, E, 11, 12, 0, 13 );
dflet 0:50cedd586816 225 P2( E, A, B, C, D, 5, 7, 4, 7 );
dflet 0:50cedd586816 226 P2( D, E, A, B, C, 12, 5, 13, 5 );
dflet 0:50cedd586816 227 #undef F
dflet 0:50cedd586816 228 #undef K
dflet 0:50cedd586816 229 #undef Fp
dflet 0:50cedd586816 230 #undef Kp
dflet 0:50cedd586816 231
dflet 0:50cedd586816 232 #define F F4
dflet 0:50cedd586816 233 #define K 0x8F1BBCDC
dflet 0:50cedd586816 234 #define Fp F2
dflet 0:50cedd586816 235 #define Kp 0x7A6D76E9
dflet 0:50cedd586816 236 P2( C, D, E, A, B, 1, 11, 8, 15 );
dflet 0:50cedd586816 237 P2( B, C, D, E, A, 9, 12, 6, 5 );
dflet 0:50cedd586816 238 P2( A, B, C, D, E, 11, 14, 4, 8 );
dflet 0:50cedd586816 239 P2( E, A, B, C, D, 10, 15, 1, 11 );
dflet 0:50cedd586816 240 P2( D, E, A, B, C, 0, 14, 3, 14 );
dflet 0:50cedd586816 241 P2( C, D, E, A, B, 8, 15, 11, 14 );
dflet 0:50cedd586816 242 P2( B, C, D, E, A, 12, 9, 15, 6 );
dflet 0:50cedd586816 243 P2( A, B, C, D, E, 4, 8, 0, 14 );
dflet 0:50cedd586816 244 P2( E, A, B, C, D, 13, 9, 5, 6 );
dflet 0:50cedd586816 245 P2( D, E, A, B, C, 3, 14, 12, 9 );
dflet 0:50cedd586816 246 P2( C, D, E, A, B, 7, 5, 2, 12 );
dflet 0:50cedd586816 247 P2( B, C, D, E, A, 15, 6, 13, 9 );
dflet 0:50cedd586816 248 P2( A, B, C, D, E, 14, 8, 9, 12 );
dflet 0:50cedd586816 249 P2( E, A, B, C, D, 5, 6, 7, 5 );
dflet 0:50cedd586816 250 P2( D, E, A, B, C, 6, 5, 10, 15 );
dflet 0:50cedd586816 251 P2( C, D, E, A, B, 2, 12, 14, 8 );
dflet 0:50cedd586816 252 #undef F
dflet 0:50cedd586816 253 #undef K
dflet 0:50cedd586816 254 #undef Fp
dflet 0:50cedd586816 255 #undef Kp
dflet 0:50cedd586816 256
dflet 0:50cedd586816 257 #define F F5
dflet 0:50cedd586816 258 #define K 0xA953FD4E
dflet 0:50cedd586816 259 #define Fp F1
dflet 0:50cedd586816 260 #define Kp 0x00000000
dflet 0:50cedd586816 261 P2( B, C, D, E, A, 4, 9, 12, 8 );
dflet 0:50cedd586816 262 P2( A, B, C, D, E, 0, 15, 15, 5 );
dflet 0:50cedd586816 263 P2( E, A, B, C, D, 5, 5, 10, 12 );
dflet 0:50cedd586816 264 P2( D, E, A, B, C, 9, 11, 4, 9 );
dflet 0:50cedd586816 265 P2( C, D, E, A, B, 7, 6, 1, 12 );
dflet 0:50cedd586816 266 P2( B, C, D, E, A, 12, 8, 5, 5 );
dflet 0:50cedd586816 267 P2( A, B, C, D, E, 2, 13, 8, 14 );
dflet 0:50cedd586816 268 P2( E, A, B, C, D, 10, 12, 7, 6 );
dflet 0:50cedd586816 269 P2( D, E, A, B, C, 14, 5, 6, 8 );
dflet 0:50cedd586816 270 P2( C, D, E, A, B, 1, 12, 2, 13 );
dflet 0:50cedd586816 271 P2( B, C, D, E, A, 3, 13, 13, 6 );
dflet 0:50cedd586816 272 P2( A, B, C, D, E, 8, 14, 14, 5 );
dflet 0:50cedd586816 273 P2( E, A, B, C, D, 11, 11, 0, 15 );
dflet 0:50cedd586816 274 P2( D, E, A, B, C, 6, 8, 3, 13 );
dflet 0:50cedd586816 275 P2( C, D, E, A, B, 15, 5, 9, 11 );
dflet 0:50cedd586816 276 P2( B, C, D, E, A, 13, 6, 11, 11 );
dflet 0:50cedd586816 277 #undef F
dflet 0:50cedd586816 278 #undef K
dflet 0:50cedd586816 279 #undef Fp
dflet 0:50cedd586816 280 #undef Kp
dflet 0:50cedd586816 281
dflet 0:50cedd586816 282 C = ctx->state[1] + C + Dp;
dflet 0:50cedd586816 283 ctx->state[1] = ctx->state[2] + D + Ep;
dflet 0:50cedd586816 284 ctx->state[2] = ctx->state[3] + E + Ap;
dflet 0:50cedd586816 285 ctx->state[3] = ctx->state[4] + A + Bp;
dflet 0:50cedd586816 286 ctx->state[4] = ctx->state[0] + B + Cp;
dflet 0:50cedd586816 287 ctx->state[0] = C;
dflet 0:50cedd586816 288 }
dflet 0:50cedd586816 289
dflet 0:50cedd586816 290 /*
dflet 0:50cedd586816 291 * RIPEMD-160 process buffer
dflet 0:50cedd586816 292 */
dflet 0:50cedd586816 293 void ripemd160_update( ripemd160_context *ctx,
dflet 0:50cedd586816 294 const unsigned char *input, size_t ilen )
dflet 0:50cedd586816 295 {
dflet 0:50cedd586816 296 size_t fill;
dflet 0:50cedd586816 297 uint32_t left;
dflet 0:50cedd586816 298
dflet 0:50cedd586816 299 if( ilen == 0 )
dflet 0:50cedd586816 300 return;
dflet 0:50cedd586816 301
dflet 0:50cedd586816 302 left = ctx->total[0] & 0x3F;
dflet 0:50cedd586816 303 fill = 64 - left;
dflet 0:50cedd586816 304
dflet 0:50cedd586816 305 ctx->total[0] += (uint32_t) ilen;
dflet 0:50cedd586816 306 ctx->total[0] &= 0xFFFFFFFF;
dflet 0:50cedd586816 307
dflet 0:50cedd586816 308 if( ctx->total[0] < (uint32_t) ilen )
dflet 0:50cedd586816 309 ctx->total[1]++;
dflet 0:50cedd586816 310
dflet 0:50cedd586816 311 if( left && ilen >= fill )
dflet 0:50cedd586816 312 {
dflet 0:50cedd586816 313 memcpy( (void *) (ctx->buffer + left), input, fill );
dflet 0:50cedd586816 314 ripemd160_process( ctx, ctx->buffer );
dflet 0:50cedd586816 315 input += fill;
dflet 0:50cedd586816 316 ilen -= fill;
dflet 0:50cedd586816 317 left = 0;
dflet 0:50cedd586816 318 }
dflet 0:50cedd586816 319
dflet 0:50cedd586816 320 while( ilen >= 64 )
dflet 0:50cedd586816 321 {
dflet 0:50cedd586816 322 ripemd160_process( ctx, input );
dflet 0:50cedd586816 323 input += 64;
dflet 0:50cedd586816 324 ilen -= 64;
dflet 0:50cedd586816 325 }
dflet 0:50cedd586816 326
dflet 0:50cedd586816 327 if( ilen > 0 )
dflet 0:50cedd586816 328 {
dflet 0:50cedd586816 329 memcpy( (void *) (ctx->buffer + left), input, ilen );
dflet 0:50cedd586816 330 }
dflet 0:50cedd586816 331 }
dflet 0:50cedd586816 332
dflet 0:50cedd586816 333 static const unsigned char ripemd160_padding[64] =
dflet 0:50cedd586816 334 {
dflet 0:50cedd586816 335 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:50cedd586816 336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:50cedd586816 337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
dflet 0:50cedd586816 338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
dflet 0:50cedd586816 339 };
dflet 0:50cedd586816 340
dflet 0:50cedd586816 341 /*
dflet 0:50cedd586816 342 * RIPEMD-160 final digest
dflet 0:50cedd586816 343 */
dflet 0:50cedd586816 344 void ripemd160_finish( ripemd160_context *ctx, unsigned char output[20] )
dflet 0:50cedd586816 345 {
dflet 0:50cedd586816 346 uint32_t last, padn;
dflet 0:50cedd586816 347 uint32_t high, low;
dflet 0:50cedd586816 348 unsigned char msglen[8];
dflet 0:50cedd586816 349
dflet 0:50cedd586816 350 high = ( ctx->total[0] >> 29 )
dflet 0:50cedd586816 351 | ( ctx->total[1] << 3 );
dflet 0:50cedd586816 352 low = ( ctx->total[0] << 3 );
dflet 0:50cedd586816 353
dflet 0:50cedd586816 354 PUT_UINT32_LE( low, msglen, 0 );
dflet 0:50cedd586816 355 PUT_UINT32_LE( high, msglen, 4 );
dflet 0:50cedd586816 356
dflet 0:50cedd586816 357 last = ctx->total[0] & 0x3F;
dflet 0:50cedd586816 358 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
dflet 0:50cedd586816 359
dflet 0:50cedd586816 360 ripemd160_update( ctx, ripemd160_padding, padn );
dflet 0:50cedd586816 361 ripemd160_update( ctx, msglen, 8 );
dflet 0:50cedd586816 362
dflet 0:50cedd586816 363 PUT_UINT32_LE( ctx->state[0], output, 0 );
dflet 0:50cedd586816 364 PUT_UINT32_LE( ctx->state[1], output, 4 );
dflet 0:50cedd586816 365 PUT_UINT32_LE( ctx->state[2], output, 8 );
dflet 0:50cedd586816 366 PUT_UINT32_LE( ctx->state[3], output, 12 );
dflet 0:50cedd586816 367 PUT_UINT32_LE( ctx->state[4], output, 16 );
dflet 0:50cedd586816 368 }
dflet 0:50cedd586816 369
dflet 0:50cedd586816 370 /*
dflet 0:50cedd586816 371 * output = RIPEMD-160( input buffer )
dflet 0:50cedd586816 372 */
dflet 0:50cedd586816 373 void ripemd160( const unsigned char *input, size_t ilen,
dflet 0:50cedd586816 374 unsigned char output[20] )
dflet 0:50cedd586816 375 {
dflet 0:50cedd586816 376 ripemd160_context ctx;
dflet 0:50cedd586816 377
dflet 0:50cedd586816 378 ripemd160_init( &ctx );
dflet 0:50cedd586816 379 ripemd160_starts( &ctx );
dflet 0:50cedd586816 380 ripemd160_update( &ctx, input, ilen );
dflet 0:50cedd586816 381 ripemd160_finish( &ctx, output );
dflet 0:50cedd586816 382 ripemd160_free( &ctx );
dflet 0:50cedd586816 383 }
dflet 0:50cedd586816 384
dflet 0:50cedd586816 385 #if defined(POLARSSL_FS_IO)
dflet 0:50cedd586816 386 /*
dflet 0:50cedd586816 387 * output = RIPEMD-160( file contents )
dflet 0:50cedd586816 388 */
dflet 0:50cedd586816 389 int ripemd160_file( const char *path, unsigned char output[20] )
dflet 0:50cedd586816 390 {
dflet 0:50cedd586816 391 FILE *f;
dflet 0:50cedd586816 392 size_t n;
dflet 0:50cedd586816 393 ripemd160_context ctx;
dflet 0:50cedd586816 394 unsigned char buf[1024];
dflet 0:50cedd586816 395
dflet 0:50cedd586816 396 if( ( f = fopen( path, "rb" ) ) == NULL )
dflet 0:50cedd586816 397 return( POLARSSL_ERR_RIPEMD160_FILE_IO_ERROR );
dflet 0:50cedd586816 398
dflet 0:50cedd586816 399 ripemd160_init( &ctx );
dflet 0:50cedd586816 400 ripemd160_starts( &ctx );
dflet 0:50cedd586816 401
dflet 0:50cedd586816 402 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
dflet 0:50cedd586816 403 ripemd160_update( &ctx, buf, n );
dflet 0:50cedd586816 404
dflet 0:50cedd586816 405 ripemd160_finish( &ctx, output );
dflet 0:50cedd586816 406 ripemd160_free( &ctx );
dflet 0:50cedd586816 407
dflet 0:50cedd586816 408 if( ferror( f ) != 0 )
dflet 0:50cedd586816 409 {
dflet 0:50cedd586816 410 fclose( f );
dflet 0:50cedd586816 411 return( POLARSSL_ERR_RIPEMD160_FILE_IO_ERROR );
dflet 0:50cedd586816 412 }
dflet 0:50cedd586816 413
dflet 0:50cedd586816 414 fclose( f );
dflet 0:50cedd586816 415 return( 0 );
dflet 0:50cedd586816 416 }
dflet 0:50cedd586816 417 #endif /* POLARSSL_FS_IO */
dflet 0:50cedd586816 418
dflet 0:50cedd586816 419 /*
dflet 0:50cedd586816 420 * RIPEMD-160 HMAC context setup
dflet 0:50cedd586816 421 */
dflet 0:50cedd586816 422 void ripemd160_hmac_starts( ripemd160_context *ctx,
dflet 0:50cedd586816 423 const unsigned char *key, size_t keylen )
dflet 0:50cedd586816 424 {
dflet 0:50cedd586816 425 size_t i;
dflet 0:50cedd586816 426 unsigned char sum[20];
dflet 0:50cedd586816 427
dflet 0:50cedd586816 428 if( keylen > 64 )
dflet 0:50cedd586816 429 {
dflet 0:50cedd586816 430 ripemd160( key, keylen, sum );
dflet 0:50cedd586816 431 keylen = 20;
dflet 0:50cedd586816 432 key = sum;
dflet 0:50cedd586816 433 }
dflet 0:50cedd586816 434
dflet 0:50cedd586816 435 memset( ctx->ipad, 0x36, 64 );
dflet 0:50cedd586816 436 memset( ctx->opad, 0x5C, 64 );
dflet 0:50cedd586816 437
dflet 0:50cedd586816 438 for( i = 0; i < keylen; i++ )
dflet 0:50cedd586816 439 {
dflet 0:50cedd586816 440 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
dflet 0:50cedd586816 441 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
dflet 0:50cedd586816 442 }
dflet 0:50cedd586816 443
dflet 0:50cedd586816 444 ripemd160_starts( ctx );
dflet 0:50cedd586816 445 ripemd160_update( ctx, ctx->ipad, 64 );
dflet 0:50cedd586816 446
dflet 0:50cedd586816 447 polarssl_zeroize( sum, sizeof( sum ) );
dflet 0:50cedd586816 448 }
dflet 0:50cedd586816 449
dflet 0:50cedd586816 450 /*
dflet 0:50cedd586816 451 * RIPEMD-160 HMAC process buffer
dflet 0:50cedd586816 452 */
dflet 0:50cedd586816 453 void ripemd160_hmac_update( ripemd160_context *ctx,
dflet 0:50cedd586816 454 const unsigned char *input, size_t ilen )
dflet 0:50cedd586816 455 {
dflet 0:50cedd586816 456 ripemd160_update( ctx, input, ilen );
dflet 0:50cedd586816 457 }
dflet 0:50cedd586816 458
dflet 0:50cedd586816 459 /*
dflet 0:50cedd586816 460 * RIPEMD-160 HMAC final digest
dflet 0:50cedd586816 461 */
dflet 0:50cedd586816 462 void ripemd160_hmac_finish( ripemd160_context *ctx, unsigned char output[20] )
dflet 0:50cedd586816 463 {
dflet 0:50cedd586816 464 unsigned char tmpbuf[20];
dflet 0:50cedd586816 465
dflet 0:50cedd586816 466 ripemd160_finish( ctx, tmpbuf );
dflet 0:50cedd586816 467 ripemd160_starts( ctx );
dflet 0:50cedd586816 468 ripemd160_update( ctx, ctx->opad, 64 );
dflet 0:50cedd586816 469 ripemd160_update( ctx, tmpbuf, 20 );
dflet 0:50cedd586816 470 ripemd160_finish( ctx, output );
dflet 0:50cedd586816 471
dflet 0:50cedd586816 472 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
dflet 0:50cedd586816 473 }
dflet 0:50cedd586816 474
dflet 0:50cedd586816 475 /*
dflet 0:50cedd586816 476 * RIPEMD-160 HMAC context reset
dflet 0:50cedd586816 477 */
dflet 0:50cedd586816 478 void ripemd160_hmac_reset( ripemd160_context *ctx )
dflet 0:50cedd586816 479 {
dflet 0:50cedd586816 480 ripemd160_starts( ctx );
dflet 0:50cedd586816 481 ripemd160_update( ctx, ctx->ipad, 64 );
dflet 0:50cedd586816 482 }
dflet 0:50cedd586816 483
dflet 0:50cedd586816 484 /*
dflet 0:50cedd586816 485 * output = HMAC-RIPEMD-160( hmac key, input buffer )
dflet 0:50cedd586816 486 */
dflet 0:50cedd586816 487 void ripemd160_hmac( const unsigned char *key, size_t keylen,
dflet 0:50cedd586816 488 const unsigned char *input, size_t ilen,
dflet 0:50cedd586816 489 unsigned char output[20] )
dflet 0:50cedd586816 490 {
dflet 0:50cedd586816 491 ripemd160_context ctx;
dflet 0:50cedd586816 492
dflet 0:50cedd586816 493 ripemd160_init( &ctx );
dflet 0:50cedd586816 494 ripemd160_hmac_starts( &ctx, key, keylen );
dflet 0:50cedd586816 495 ripemd160_hmac_update( &ctx, input, ilen );
dflet 0:50cedd586816 496 ripemd160_hmac_finish( &ctx, output );
dflet 0:50cedd586816 497 ripemd160_free( &ctx );
dflet 0:50cedd586816 498 }
dflet 0:50cedd586816 499
dflet 0:50cedd586816 500
dflet 0:50cedd586816 501 #if defined(POLARSSL_SELF_TEST)
dflet 0:50cedd586816 502 /*
dflet 0:50cedd586816 503 * Test vectors from the RIPEMD-160 paper and
dflet 0:50cedd586816 504 * http://homes.esat.kuleuven.be/~bosselae/ripemd160.html#HMAC
dflet 0:50cedd586816 505 */
dflet 0:50cedd586816 506 #define TESTS 8
dflet 0:50cedd586816 507 #define KEYS 2
dflet 0:50cedd586816 508 static const char *ripemd160_test_input[TESTS] =
dflet 0:50cedd586816 509 {
dflet 0:50cedd586816 510 "",
dflet 0:50cedd586816 511 "a",
dflet 0:50cedd586816 512 "abc",
dflet 0:50cedd586816 513 "message digest",
dflet 0:50cedd586816 514 "abcdefghijklmnopqrstuvwxyz",
dflet 0:50cedd586816 515 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
dflet 0:50cedd586816 516 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
dflet 0:50cedd586816 517 "1234567890123456789012345678901234567890"
dflet 0:50cedd586816 518 "1234567890123456789012345678901234567890",
dflet 0:50cedd586816 519 };
dflet 0:50cedd586816 520
dflet 0:50cedd586816 521 static const unsigned char ripemd160_test_md[TESTS][20] =
dflet 0:50cedd586816 522 {
dflet 0:50cedd586816 523 { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
dflet 0:50cedd586816 524 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },
dflet 0:50cedd586816 525 { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
dflet 0:50cedd586816 526 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },
dflet 0:50cedd586816 527 { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
dflet 0:50cedd586816 528 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },
dflet 0:50cedd586816 529 { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
dflet 0:50cedd586816 530 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },
dflet 0:50cedd586816 531 { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
dflet 0:50cedd586816 532 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },
dflet 0:50cedd586816 533 { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
dflet 0:50cedd586816 534 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },
dflet 0:50cedd586816 535 { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,
dflet 0:50cedd586816 536 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },
dflet 0:50cedd586816 537 { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,
dflet 0:50cedd586816 538 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },
dflet 0:50cedd586816 539 };
dflet 0:50cedd586816 540
dflet 0:50cedd586816 541 static const unsigned char ripemd160_test_hmac[KEYS][TESTS][20] =
dflet 0:50cedd586816 542 {
dflet 0:50cedd586816 543 {
dflet 0:50cedd586816 544 { 0xcf, 0x38, 0x76, 0x77, 0xbf, 0xda, 0x84, 0x83, 0xe6, 0x3b,
dflet 0:50cedd586816 545 0x57, 0xe0, 0x6c, 0x3b, 0x5e, 0xcd, 0x8b, 0x7f, 0xc0, 0x55 },
dflet 0:50cedd586816 546 { 0x0d, 0x35, 0x1d, 0x71, 0xb7, 0x8e, 0x36, 0xdb, 0xb7, 0x39,
dflet 0:50cedd586816 547 0x1c, 0x81, 0x0a, 0x0d, 0x2b, 0x62, 0x40, 0xdd, 0xba, 0xfc },
dflet 0:50cedd586816 548 { 0xf7, 0xef, 0x28, 0x8c, 0xb1, 0xbb, 0xcc, 0x61, 0x60, 0xd7,
dflet 0:50cedd586816 549 0x65, 0x07, 0xe0, 0xa3, 0xbb, 0xf7, 0x12, 0xfb, 0x67, 0xd6 },
dflet 0:50cedd586816 550 { 0xf8, 0x36, 0x62, 0xcc, 0x8d, 0x33, 0x9c, 0x22, 0x7e, 0x60,
dflet 0:50cedd586816 551 0x0f, 0xcd, 0x63, 0x6c, 0x57, 0xd2, 0x57, 0x1b, 0x1c, 0x34 },
dflet 0:50cedd586816 552 { 0x84, 0x3d, 0x1c, 0x4e, 0xb8, 0x80, 0xac, 0x8a, 0xc0, 0xc9,
dflet 0:50cedd586816 553 0xc9, 0x56, 0x96, 0x50, 0x79, 0x57, 0xd0, 0x15, 0x5d, 0xdb },
dflet 0:50cedd586816 554 { 0x60, 0xf5, 0xef, 0x19, 0x8a, 0x2d, 0xd5, 0x74, 0x55, 0x45,
dflet 0:50cedd586816 555 0xc1, 0xf0, 0xc4, 0x7a, 0xa3, 0xfb, 0x57, 0x76, 0xf8, 0x81 },
dflet 0:50cedd586816 556 { 0xe4, 0x9c, 0x13, 0x6a, 0x9e, 0x56, 0x27, 0xe0, 0x68, 0x1b,
dflet 0:50cedd586816 557 0x80, 0x8a, 0x3b, 0x97, 0xe6, 0xa6, 0xe6, 0x61, 0xae, 0x79 },
dflet 0:50cedd586816 558 { 0x31, 0xbe, 0x3c, 0xc9, 0x8c, 0xee, 0x37, 0xb7, 0x9b, 0x06,
dflet 0:50cedd586816 559 0x19, 0xe3, 0xe1, 0xc2, 0xbe, 0x4f, 0x1a, 0xa5, 0x6e, 0x6c },
dflet 0:50cedd586816 560 },
dflet 0:50cedd586816 561 {
dflet 0:50cedd586816 562 { 0xfe, 0x69, 0xa6, 0x6c, 0x74, 0x23, 0xee, 0xa9, 0xc8, 0xfa,
dflet 0:50cedd586816 563 0x2e, 0xff, 0x8d, 0x9d, 0xaf, 0xb4, 0xf1, 0x7a, 0x62, 0xf5 },
dflet 0:50cedd586816 564 { 0x85, 0x74, 0x3e, 0x89, 0x9b, 0xc8, 0x2d, 0xbf, 0xa3, 0x6f,
dflet 0:50cedd586816 565 0xaa, 0xa7, 0xa2, 0x5b, 0x7c, 0xfd, 0x37, 0x24, 0x32, 0xcd },
dflet 0:50cedd586816 566 { 0x6e, 0x4a, 0xfd, 0x50, 0x1f, 0xa6, 0xb4, 0xa1, 0x82, 0x3c,
dflet 0:50cedd586816 567 0xa3, 0xb1, 0x0b, 0xd9, 0xaa, 0x0b, 0xa9, 0x7b, 0xa1, 0x82 },
dflet 0:50cedd586816 568 { 0x2e, 0x06, 0x6e, 0x62, 0x4b, 0xad, 0xb7, 0x6a, 0x18, 0x4c,
dflet 0:50cedd586816 569 0x8f, 0x90, 0xfb, 0xa0, 0x53, 0x33, 0x0e, 0x65, 0x0e, 0x92 },
dflet 0:50cedd586816 570 { 0x07, 0xe9, 0x42, 0xaa, 0x4e, 0x3c, 0xd7, 0xc0, 0x4d, 0xed,
dflet 0:50cedd586816 571 0xc1, 0xd4, 0x6e, 0x2e, 0x8c, 0xc4, 0xc7, 0x41, 0xb3, 0xd9 },
dflet 0:50cedd586816 572 { 0xb6, 0x58, 0x23, 0x18, 0xdd, 0xcf, 0xb6, 0x7a, 0x53, 0xa6,
dflet 0:50cedd586816 573 0x7d, 0x67, 0x6b, 0x8a, 0xd8, 0x69, 0xad, 0xed, 0x62, 0x9a },
dflet 0:50cedd586816 574 { 0xf1, 0xbe, 0x3e, 0xe8, 0x77, 0x70, 0x31, 0x40, 0xd3, 0x4f,
dflet 0:50cedd586816 575 0x97, 0xea, 0x1a, 0xb3, 0xa0, 0x7c, 0x14, 0x13, 0x33, 0xe2 },
dflet 0:50cedd586816 576 { 0x85, 0xf1, 0x64, 0x70, 0x3e, 0x61, 0xa6, 0x31, 0x31, 0xbe,
dflet 0:50cedd586816 577 0x7e, 0x45, 0x95, 0x8e, 0x07, 0x94, 0x12, 0x39, 0x04, 0xf9 },
dflet 0:50cedd586816 578 },
dflet 0:50cedd586816 579 };
dflet 0:50cedd586816 580
dflet 0:50cedd586816 581 static const unsigned char ripemd160_test_key[KEYS][20] =
dflet 0:50cedd586816 582 {
dflet 0:50cedd586816 583 { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
dflet 0:50cedd586816 584 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x23, 0x45, 0x67 },
dflet 0:50cedd586816 585 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc,
dflet 0:50cedd586816 586 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33 },
dflet 0:50cedd586816 587 };
dflet 0:50cedd586816 588
dflet 0:50cedd586816 589 /*
dflet 0:50cedd586816 590 * Checkup routine
dflet 0:50cedd586816 591 */
dflet 0:50cedd586816 592 int ripemd160_self_test( int verbose )
dflet 0:50cedd586816 593 {
dflet 0:50cedd586816 594 int i, j;
dflet 0:50cedd586816 595 unsigned char output[20];
dflet 0:50cedd586816 596
dflet 0:50cedd586816 597 memset( output, 0, sizeof output );
dflet 0:50cedd586816 598
dflet 0:50cedd586816 599 for( i = 0; i < TESTS; i++ )
dflet 0:50cedd586816 600 {
dflet 0:50cedd586816 601 if( verbose != 0 )
dflet 0:50cedd586816 602 polarssl_printf( " RIPEMD-160 test #%d: ", i + 1 );
dflet 0:50cedd586816 603
dflet 0:50cedd586816 604 ripemd160( (const unsigned char *) ripemd160_test_input[i],
dflet 0:50cedd586816 605 strlen( ripemd160_test_input[i] ),
dflet 0:50cedd586816 606 output );
dflet 0:50cedd586816 607
dflet 0:50cedd586816 608 if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )
dflet 0:50cedd586816 609 {
dflet 0:50cedd586816 610 if( verbose != 0 )
dflet 0:50cedd586816 611 polarssl_printf( "failed\n" );
dflet 0:50cedd586816 612
dflet 0:50cedd586816 613 return( 1 );
dflet 0:50cedd586816 614 }
dflet 0:50cedd586816 615
dflet 0:50cedd586816 616 if( verbose != 0 )
dflet 0:50cedd586816 617 polarssl_printf( "passed\n" );
dflet 0:50cedd586816 618
dflet 0:50cedd586816 619 for( j = 0; j < KEYS; j++ )
dflet 0:50cedd586816 620 {
dflet 0:50cedd586816 621 if( verbose != 0 )
dflet 0:50cedd586816 622 polarssl_printf( " HMAC-RIPEMD-160 test #%d, key #%d: ",
dflet 0:50cedd586816 623 i + 1, j + 1 );
dflet 0:50cedd586816 624
dflet 0:50cedd586816 625 ripemd160_hmac( ripemd160_test_key[j], 20,
dflet 0:50cedd586816 626 (const unsigned char *) ripemd160_test_input[i],
dflet 0:50cedd586816 627 strlen( ripemd160_test_input[i] ),
dflet 0:50cedd586816 628 output );
dflet 0:50cedd586816 629
dflet 0:50cedd586816 630 if( memcmp( output, ripemd160_test_hmac[j][i], 20 ) != 0 )
dflet 0:50cedd586816 631 {
dflet 0:50cedd586816 632 if( verbose != 0 )
dflet 0:50cedd586816 633 polarssl_printf( "failed\n" );
dflet 0:50cedd586816 634
dflet 0:50cedd586816 635 return( 1 );
dflet 0:50cedd586816 636 }
dflet 0:50cedd586816 637
dflet 0:50cedd586816 638 if( verbose != 0 )
dflet 0:50cedd586816 639 polarssl_printf( "passed\n" );
dflet 0:50cedd586816 640 }
dflet 0:50cedd586816 641
dflet 0:50cedd586816 642 if( verbose != 0 )
dflet 0:50cedd586816 643 polarssl_printf( "\n" );
dflet 0:50cedd586816 644 }
dflet 0:50cedd586816 645
dflet 0:50cedd586816 646 return( 0 );
dflet 0:50cedd586816 647 }
dflet 0:50cedd586816 648
dflet 0:50cedd586816 649 #endif /* POLARSSL_SELF_TEST */
dflet 0:50cedd586816 650
dflet 0:50cedd586816 651 #endif /* POLARSSL_RIPEMD160_C */
dflet 0:50cedd586816 652