blob: 8c77cbaa8fc20b71ea8683c0aa7e11dff95ece8b [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-1 compliant SHA-1 implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
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.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The SHA-1 standard was published by NIST in 1993.
23 *
24 * http://www.itl.nist.gov/fipspubs/fip180-1.htm
25 */
26
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000028#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020029#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020033#if defined(MBEDTLS_SHA1_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000034
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000035#include "mbedtls/sha1.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000036
Rich Evans00ab4702015-02-06 13:43:58 +000037#include <string.h>
38
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_SELF_TEST)
40#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000041#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010042#else
Rich Evans00ab4702015-02-06 13:43:58 +000043#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#define mbedtls_printf printf
45#endif /* MBEDTLS_PLATFORM_C */
46#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020048#if !defined(MBEDTLS_SHA1_ALT)
49
Paul Bakker34617722014-06-13 17:20:13 +020050/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020052 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
53}
54
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * 32-bit integer manipulation macros (big endian)
57 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000058#ifndef GET_UINT32_BE
59#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000060{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000061 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
62 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
63 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
64 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000065}
66#endif
67
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef PUT_UINT32_BE
69#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
71 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
72 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
73 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
74 (b)[(i) + 3] = (unsigned char) ( (n) ); \
75}
76#endif
77
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078void mbedtls_sha1_init( mbedtls_sha1_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_sha1_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020081}
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083void mbedtls_sha1_free( mbedtls_sha1_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_sha1_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020089}
90
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020091void mbedtls_sha1_clone( mbedtls_sha1_context *dst,
92 const mbedtls_sha1_context *src )
93{
94 *dst = *src;
95}
96
Paul Bakker5121ce52009-01-03 21:22:43 +000097/*
98 * SHA-1 context setup
99 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200100void mbedtls_sha1_starts( mbedtls_sha1_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000101{
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_SHA1_PROCESS_ALT)
113void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000114{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000115 uint32_t temp, W[16], A, B, C, D, E;
Paul Bakker5121ce52009-01-03 21:22:43 +0000116
Paul Bakker5c2364c2012-10-01 14:41:15 +0000117 GET_UINT32_BE( W[ 0], data, 0 );
118 GET_UINT32_BE( W[ 1], data, 4 );
119 GET_UINT32_BE( W[ 2], data, 8 );
120 GET_UINT32_BE( W[ 3], data, 12 );
121 GET_UINT32_BE( W[ 4], data, 16 );
122 GET_UINT32_BE( W[ 5], data, 20 );
123 GET_UINT32_BE( W[ 6], data, 24 );
124 GET_UINT32_BE( W[ 7], data, 28 );
125 GET_UINT32_BE( W[ 8], data, 32 );
126 GET_UINT32_BE( W[ 9], data, 36 );
127 GET_UINT32_BE( W[10], data, 40 );
128 GET_UINT32_BE( W[11], data, 44 );
129 GET_UINT32_BE( W[12], data, 48 );
130 GET_UINT32_BE( W[13], data, 52 );
131 GET_UINT32_BE( W[14], data, 56 );
132 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000133
134#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
135
136#define R(t) \
137( \
Paul Bakker66d5d072014-06-17 16:39:18 +0200138 temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \
139 W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \
Paul Bakker5121ce52009-01-03 21:22:43 +0000140 ( W[t & 0x0F] = S(temp,1) ) \
141)
142
143#define P(a,b,c,d,e,x) \
144{ \
145 e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
146}
147
148 A = ctx->state[0];
149 B = ctx->state[1];
150 C = ctx->state[2];
151 D = ctx->state[3];
152 E = ctx->state[4];
153
154#define F(x,y,z) (z ^ (x & (y ^ z)))
155#define K 0x5A827999
156
157 P( A, B, C, D, E, W[0] );
158 P( E, A, B, C, D, W[1] );
159 P( D, E, A, B, C, W[2] );
160 P( C, D, E, A, B, W[3] );
161 P( B, C, D, E, A, W[4] );
162 P( A, B, C, D, E, W[5] );
163 P( E, A, B, C, D, W[6] );
164 P( D, E, A, B, C, W[7] );
165 P( C, D, E, A, B, W[8] );
166 P( B, C, D, E, A, W[9] );
167 P( A, B, C, D, E, W[10] );
168 P( E, A, B, C, D, W[11] );
169 P( D, E, A, B, C, W[12] );
170 P( C, D, E, A, B, W[13] );
171 P( B, C, D, E, A, W[14] );
172 P( A, B, C, D, E, W[15] );
173 P( E, A, B, C, D, R(16) );
174 P( D, E, A, B, C, R(17) );
175 P( C, D, E, A, B, R(18) );
176 P( B, C, D, E, A, R(19) );
177
178#undef K
179#undef F
180
181#define F(x,y,z) (x ^ y ^ z)
182#define K 0x6ED9EBA1
183
184 P( A, B, C, D, E, R(20) );
185 P( E, A, B, C, D, R(21) );
186 P( D, E, A, B, C, R(22) );
187 P( C, D, E, A, B, R(23) );
188 P( B, C, D, E, A, R(24) );
189 P( A, B, C, D, E, R(25) );
190 P( E, A, B, C, D, R(26) );
191 P( D, E, A, B, C, R(27) );
192 P( C, D, E, A, B, R(28) );
193 P( B, C, D, E, A, R(29) );
194 P( A, B, C, D, E, R(30) );
195 P( E, A, B, C, D, R(31) );
196 P( D, E, A, B, C, R(32) );
197 P( C, D, E, A, B, R(33) );
198 P( B, C, D, E, A, R(34) );
199 P( A, B, C, D, E, R(35) );
200 P( E, A, B, C, D, R(36) );
201 P( D, E, A, B, C, R(37) );
202 P( C, D, E, A, B, R(38) );
203 P( B, C, D, E, A, R(39) );
204
205#undef K
206#undef F
207
208#define F(x,y,z) ((x & y) | (z & (x | y)))
209#define K 0x8F1BBCDC
210
211 P( A, B, C, D, E, R(40) );
212 P( E, A, B, C, D, R(41) );
213 P( D, E, A, B, C, R(42) );
214 P( C, D, E, A, B, R(43) );
215 P( B, C, D, E, A, R(44) );
216 P( A, B, C, D, E, R(45) );
217 P( E, A, B, C, D, R(46) );
218 P( D, E, A, B, C, R(47) );
219 P( C, D, E, A, B, R(48) );
220 P( B, C, D, E, A, R(49) );
221 P( A, B, C, D, E, R(50) );
222 P( E, A, B, C, D, R(51) );
223 P( D, E, A, B, C, R(52) );
224 P( C, D, E, A, B, R(53) );
225 P( B, C, D, E, A, R(54) );
226 P( A, B, C, D, E, R(55) );
227 P( E, A, B, C, D, R(56) );
228 P( D, E, A, B, C, R(57) );
229 P( C, D, E, A, B, R(58) );
230 P( B, C, D, E, A, R(59) );
231
232#undef K
233#undef F
234
235#define F(x,y,z) (x ^ y ^ z)
236#define K 0xCA62C1D6
237
238 P( A, B, C, D, E, R(60) );
239 P( E, A, B, C, D, R(61) );
240 P( D, E, A, B, C, R(62) );
241 P( C, D, E, A, B, R(63) );
242 P( B, C, D, E, A, R(64) );
243 P( A, B, C, D, E, R(65) );
244 P( E, A, B, C, D, R(66) );
245 P( D, E, A, B, C, R(67) );
246 P( C, D, E, A, B, R(68) );
247 P( B, C, D, E, A, R(69) );
248 P( A, B, C, D, E, R(70) );
249 P( E, A, B, C, D, R(71) );
250 P( D, E, A, B, C, R(72) );
251 P( C, D, E, A, B, R(73) );
252 P( B, C, D, E, A, R(74) );
253 P( A, B, C, D, E, R(75) );
254 P( E, A, B, C, D, R(76) );
255 P( D, E, A, B, C, R(77) );
256 P( C, D, E, A, B, R(78) );
257 P( B, C, D, E, A, R(79) );
258
259#undef K
260#undef F
261
262 ctx->state[0] += A;
263 ctx->state[1] += B;
264 ctx->state[2] += C;
265 ctx->state[3] += D;
266 ctx->state[4] += E;
267}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268#endif /* !MBEDTLS_SHA1_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000269
270/*
271 * SHA-1 process buffer
272 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000274{
Paul Bakker23986e52011-04-24 08:57:21 +0000275 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000276 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000277
Brian White12895d12014-04-11 11:29:42 -0400278 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000279 return;
280
281 left = ctx->total[0] & 0x3F;
282 fill = 64 - left;
283
Paul Bakker5c2364c2012-10-01 14:41:15 +0000284 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000285 ctx->total[0] &= 0xFFFFFFFF;
286
Paul Bakker5c2364c2012-10-01 14:41:15 +0000287 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000288 ctx->total[1]++;
289
290 if( left && ilen >= fill )
291 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200292 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293 mbedtls_sha1_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 input += fill;
295 ilen -= fill;
296 left = 0;
297 }
298
299 while( ilen >= 64 )
300 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301 mbedtls_sha1_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302 input += 64;
303 ilen -= 64;
304 }
305
306 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200307 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000308}
309
310static const unsigned char sha1_padding[64] =
311{
312 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
316};
317
318/*
319 * SHA-1 final digest
320 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000322{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000323 uint32_t last, padn;
324 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 unsigned char msglen[8];
326
327 high = ( ctx->total[0] >> 29 )
328 | ( ctx->total[1] << 3 );
329 low = ( ctx->total[0] << 3 );
330
Paul Bakker5c2364c2012-10-01 14:41:15 +0000331 PUT_UINT32_BE( high, msglen, 0 );
332 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000333
334 last = ctx->total[0] & 0x3F;
335 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337 mbedtls_sha1_update( ctx, sha1_padding, padn );
338 mbedtls_sha1_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
Paul Bakker5c2364c2012-10-01 14:41:15 +0000340 PUT_UINT32_BE( ctx->state[0], output, 0 );
341 PUT_UINT32_BE( ctx->state[1], output, 4 );
342 PUT_UINT32_BE( ctx->state[2], output, 8 );
343 PUT_UINT32_BE( ctx->state[3], output, 12 );
344 PUT_UINT32_BE( ctx->state[4], output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000345}
346
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200347#endif /* !MBEDTLS_SHA1_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200348
Paul Bakker5121ce52009-01-03 21:22:43 +0000349/*
350 * output = SHA-1( input buffer )
351 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000353{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354 mbedtls_sha1_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356 mbedtls_sha1_init( &ctx );
357 mbedtls_sha1_starts( &ctx );
358 mbedtls_sha1_update( &ctx, input, ilen );
359 mbedtls_sha1_finish( &ctx, output );
360 mbedtls_sha1_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361}
362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000364/*
365 * FIPS-180-1 test vectors
366 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000367static const unsigned char sha1_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000368{
369 { "abc" },
370 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
371 { "" }
372};
373
374static const int sha1_test_buflen[3] =
375{
376 3, 56, 1000
377};
378
379static const unsigned char sha1_test_sum[3][20] =
380{
381 { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
382 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
383 { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
384 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
385 { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
386 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
387};
388
389/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000390 * Checkup routine
391 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392int mbedtls_sha1_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000393{
Paul Bakker5b4af392014-06-26 12:09:34 +0200394 int i, j, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000395 unsigned char buf[1024];
396 unsigned char sha1sum[20];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397 mbedtls_sha1_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399 mbedtls_sha1_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200400
Paul Bakker5121ce52009-01-03 21:22:43 +0000401 /*
402 * SHA-1
403 */
404 for( i = 0; i < 3; i++ )
405 {
406 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407 mbedtls_printf( " SHA-1 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 mbedtls_sha1_starts( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
411 if( i == 2 )
412 {
413 memset( buf, 'a', buflen = 1000 );
414
415 for( j = 0; j < 1000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 mbedtls_sha1_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417 }
418 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_sha1_update( &ctx, sha1_test_buf[i],
Paul Bakker5121ce52009-01-03 21:22:43 +0000420 sha1_test_buflen[i] );
421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200422 mbedtls_sha1_finish( &ctx, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000423
424 if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
425 {
426 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
Paul Bakker5b4af392014-06-26 12:09:34 +0200429 ret = 1;
430 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000431 }
432
433 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000435 }
436
437 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000439
Paul Bakker5b4af392014-06-26 12:09:34 +0200440exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 mbedtls_sha1_free( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200442
443 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000444}
445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448#endif /* MBEDTLS_SHA1_C */