source: azure_iot_hub_mbedtls/trunk/mbedtls-2.16.1/library/sha256.c@ 398

Last change on this file since 398 was 398, checked in by coas-nagasima, 5 years ago

mbedTLS版Azure IoT Hub接続サンプルのソースコードを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 16.1 KB
Line 
1/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5 * 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.
18 *
19 * This file is part of mbed TLS (https://tls.mbed.org)
20 */
21/*
22 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
23 *
24 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
25 */
26
27#if !defined(MBEDTLS_CONFIG_FILE)
28#include "mbedtls/config.h"
29#else
30#include MBEDTLS_CONFIG_FILE
31#endif
32
33#if defined(MBEDTLS_SHA256_C)
34
35#include "mbedtls/sha256.h"
36#include "mbedtls/platform_util.h"
37
38#include <string.h>
39
40#if defined(MBEDTLS_SELF_TEST)
41#if defined(MBEDTLS_PLATFORM_C)
42#include "mbedtls/platform.h"
43#else
44#include <stdio.h>
45#include <stdlib.h>
46#define mbedtls_printf printf
47#define mbedtls_calloc calloc
48#define mbedtls_free free
49#endif /* MBEDTLS_PLATFORM_C */
50#endif /* MBEDTLS_SELF_TEST */
51
52#define SHA256_VALIDATE_RET(cond) \
53 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
54#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
55
56#if !defined(MBEDTLS_SHA256_ALT)
57
58/*
59 * 32-bit integer manipulation macros (big endian)
60 */
61#ifndef GET_UINT32_BE
62#define GET_UINT32_BE(n,b,i) \
63do { \
64 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
65 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
66 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
67 | ( (uint32_t) (b)[(i) + 3] ); \
68} while( 0 )
69#endif
70
71#ifndef PUT_UINT32_BE
72#define PUT_UINT32_BE(n,b,i) \
73do { \
74 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
75 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
76 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
77 (b)[(i) + 3] = (unsigned char) ( (n) ); \
78} while( 0 )
79#endif
80
81void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
82{
83 SHA256_VALIDATE( ctx != NULL );
84
85 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
86}
87
88void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
89{
90 if( ctx == NULL )
91 return;
92
93 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
94}
95
96void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
97 const mbedtls_sha256_context *src )
98{
99 SHA256_VALIDATE( dst != NULL );
100 SHA256_VALIDATE( src != NULL );
101
102 *dst = *src;
103}
104
105/*
106 * SHA-256 context setup
107 */
108int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
109{
110 SHA256_VALIDATE_RET( ctx != NULL );
111 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
112
113 ctx->total[0] = 0;
114 ctx->total[1] = 0;
115
116 if( is224 == 0 )
117 {
118 /* SHA-256 */
119 ctx->state[0] = 0x6A09E667;
120 ctx->state[1] = 0xBB67AE85;
121 ctx->state[2] = 0x3C6EF372;
122 ctx->state[3] = 0xA54FF53A;
123 ctx->state[4] = 0x510E527F;
124 ctx->state[5] = 0x9B05688C;
125 ctx->state[6] = 0x1F83D9AB;
126 ctx->state[7] = 0x5BE0CD19;
127 }
128 else
129 {
130 /* SHA-224 */
131 ctx->state[0] = 0xC1059ED8;
132 ctx->state[1] = 0x367CD507;
133 ctx->state[2] = 0x3070DD17;
134 ctx->state[3] = 0xF70E5939;
135 ctx->state[4] = 0xFFC00B31;
136 ctx->state[5] = 0x68581511;
137 ctx->state[6] = 0x64F98FA7;
138 ctx->state[7] = 0xBEFA4FA4;
139 }
140
141 ctx->is224 = is224;
142
143 return( 0 );
144}
145
146#if !defined(MBEDTLS_DEPRECATED_REMOVED)
147void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
148 int is224 )
149{
150 mbedtls_sha256_starts_ret( ctx, is224 );
151}
152#endif
153
154#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
155static const uint32_t K[] =
156{
157 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
158 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
159 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
160 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
161 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
162 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
163 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
164 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
165 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
166 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
167 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
168 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
169 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
170 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
171 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
172 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
173};
174
175#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
176#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
177
178#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
179#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
180
181#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
182#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
183
184#define F0(x,y,z) ((x & y) | (z & (x | y)))
185#define F1(x,y,z) (z ^ (x & (y ^ z)))
186
187#define R(t) \
188( \
189 W[t] = S1(W[t - 2]) + W[t - 7] + \
190 S0(W[t - 15]) + W[t - 16] \
191)
192
193#define P(a,b,c,d,e,f,g,h,x,K) \
194{ \
195 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
196 temp2 = S2(a) + F0(a,b,c); \
197 d += temp1; h = temp1 + temp2; \
198}
199
200int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
201 const unsigned char data[64] )
202{
203 uint32_t temp1, temp2, W[64];
204 uint32_t A[8];
205 unsigned int i;
206
207 SHA256_VALIDATE_RET( ctx != NULL );
208 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
209
210 for( i = 0; i < 8; i++ )
211 A[i] = ctx->state[i];
212
213#if defined(MBEDTLS_SHA256_SMALLER)
214 for( i = 0; i < 64; i++ )
215 {
216 if( i < 16 )
217 GET_UINT32_BE( W[i], data, 4 * i );
218 else
219 R( i );
220
221 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
222
223 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
224 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
225 }
226#else /* MBEDTLS_SHA256_SMALLER */
227 for( i = 0; i < 16; i++ )
228 GET_UINT32_BE( W[i], data, 4 * i );
229
230 for( i = 0; i < 16; i += 8 )
231 {
232 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
233 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
234 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
235 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
236 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
237 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
238 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
239 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
240 }
241
242 for( i = 16; i < 64; i += 8 )
243 {
244 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
245 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
246 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
247 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
248 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
249 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
250 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
251 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
252 }
253#endif /* MBEDTLS_SHA256_SMALLER */
254
255 for( i = 0; i < 8; i++ )
256 ctx->state[i] += A[i];
257
258 return( 0 );
259}
260
261#if !defined(MBEDTLS_DEPRECATED_REMOVED)
262void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
263 const unsigned char data[64] )
264{
265 mbedtls_internal_sha256_process( ctx, data );
266}
267#endif
268#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
269
270/*
271 * SHA-256 process buffer
272 */
273int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
274 const unsigned char *input,
275 size_t ilen )
276{
277 int ret;
278 size_t fill;
279 uint32_t left;
280
281 SHA256_VALIDATE_RET( ctx != NULL );
282 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
283
284 if( ilen == 0 )
285 return( 0 );
286
287 left = ctx->total[0] & 0x3F;
288 fill = 64 - left;
289
290 ctx->total[0] += (uint32_t) ilen;
291 ctx->total[0] &= 0xFFFFFFFF;
292
293 if( ctx->total[0] < (uint32_t) ilen )
294 ctx->total[1]++;
295
296 if( left && ilen >= fill )
297 {
298 memcpy( (void *) (ctx->buffer + left), input, fill );
299
300 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
301 return( ret );
302
303 input += fill;
304 ilen -= fill;
305 left = 0;
306 }
307
308 while( ilen >= 64 )
309 {
310 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
311 return( ret );
312
313 input += 64;
314 ilen -= 64;
315 }
316
317 if( ilen > 0 )
318 memcpy( (void *) (ctx->buffer + left), input, ilen );
319
320 return( 0 );
321}
322
323#if !defined(MBEDTLS_DEPRECATED_REMOVED)
324void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
325 const unsigned char *input,
326 size_t ilen )
327{
328 mbedtls_sha256_update_ret( ctx, input, ilen );
329}
330#endif
331
332/*
333 * SHA-256 final digest
334 */
335int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
336 unsigned char output[32] )
337{
338 int ret;
339 uint32_t used;
340 uint32_t high, low;
341
342 SHA256_VALIDATE_RET( ctx != NULL );
343 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
344
345 /*
346 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
347 */
348 used = ctx->total[0] & 0x3F;
349
350 ctx->buffer[used++] = 0x80;
351
352 if( used <= 56 )
353 {
354 /* Enough room for padding + length in current block */
355 memset( ctx->buffer + used, 0, 56 - used );
356 }
357 else
358 {
359 /* We'll need an extra block */
360 memset( ctx->buffer + used, 0, 64 - used );
361
362 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
363 return( ret );
364
365 memset( ctx->buffer, 0, 56 );
366 }
367
368 /*
369 * Add message length
370 */
371 high = ( ctx->total[0] >> 29 )
372 | ( ctx->total[1] << 3 );
373 low = ( ctx->total[0] << 3 );
374
375 PUT_UINT32_BE( high, ctx->buffer, 56 );
376 PUT_UINT32_BE( low, ctx->buffer, 60 );
377
378 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
379 return( ret );
380
381 /*
382 * Output final state
383 */
384 PUT_UINT32_BE( ctx->state[0], output, 0 );
385 PUT_UINT32_BE( ctx->state[1], output, 4 );
386 PUT_UINT32_BE( ctx->state[2], output, 8 );
387 PUT_UINT32_BE( ctx->state[3], output, 12 );
388 PUT_UINT32_BE( ctx->state[4], output, 16 );
389 PUT_UINT32_BE( ctx->state[5], output, 20 );
390 PUT_UINT32_BE( ctx->state[6], output, 24 );
391
392 if( ctx->is224 == 0 )
393 PUT_UINT32_BE( ctx->state[7], output, 28 );
394
395 return( 0 );
396}
397
398#if !defined(MBEDTLS_DEPRECATED_REMOVED)
399void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
400 unsigned char output[32] )
401{
402 mbedtls_sha256_finish_ret( ctx, output );
403}
404#endif
405
406#endif /* !MBEDTLS_SHA256_ALT */
407
408/*
409 * output = SHA-256( input buffer )
410 */
411int mbedtls_sha256_ret( const unsigned char *input,
412 size_t ilen,
413 unsigned char output[32],
414 int is224 )
415{
416 int ret;
417 mbedtls_sha256_context ctx;
418
419 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
420 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
421 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
422
423 mbedtls_sha256_init( &ctx );
424
425 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
426 goto exit;
427
428 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
429 goto exit;
430
431 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
432 goto exit;
433
434exit:
435 mbedtls_sha256_free( &ctx );
436
437 return( ret );
438}
439
440#if !defined(MBEDTLS_DEPRECATED_REMOVED)
441void mbedtls_sha256( const unsigned char *input,
442 size_t ilen,
443 unsigned char output[32],
444 int is224 )
445{
446 mbedtls_sha256_ret( input, ilen, output, is224 );
447}
448#endif
449
450#if defined(MBEDTLS_SELF_TEST)
451/*
452 * FIPS-180-2 test vectors
453 */
454static const unsigned char sha256_test_buf[3][57] =
455{
456 { "abc" },
457 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
458 { "" }
459};
460
461static const size_t sha256_test_buflen[3] =
462{
463 3, 56, 1000
464};
465
466static const unsigned char sha256_test_sum[6][32] =
467{
468 /*
469 * SHA-224 test vectors
470 */
471 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
472 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
473 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
474 0xE3, 0x6C, 0x9D, 0xA7 },
475 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
476 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
477 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
478 0x52, 0x52, 0x25, 0x25 },
479 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
480 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
481 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
482 0x4E, 0xE7, 0xAD, 0x67 },
483
484 /*
485 * SHA-256 test vectors
486 */
487 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
488 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
489 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
490 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
491 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
492 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
493 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
494 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
495 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
496 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
497 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
498 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
499};
500
501/*
502 * Checkup routine
503 */
504int mbedtls_sha256_self_test( int verbose )
505{
506 int i, j, k, buflen, ret = 0;
507 unsigned char *buf;
508 unsigned char sha256sum[32];
509 mbedtls_sha256_context ctx;
510
511 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
512 if( NULL == buf )
513 {
514 if( verbose != 0 )
515 mbedtls_printf( "Buffer allocation failed\n" );
516
517 return( 1 );
518 }
519
520 mbedtls_sha256_init( &ctx );
521
522 for( i = 0; i < 6; i++ )
523 {
524 j = i % 3;
525 k = i < 3;
526
527 if( verbose != 0 )
528 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
529
530 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
531 goto fail;
532
533 if( j == 2 )
534 {
535 memset( buf, 'a', buflen = 1000 );
536
537 for( j = 0; j < 1000; j++ )
538 {
539 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
540 if( ret != 0 )
541 goto fail;
542 }
543
544 }
545 else
546 {
547 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
548 sha256_test_buflen[j] );
549 if( ret != 0 )
550 goto fail;
551 }
552
553 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
554 goto fail;
555
556
557 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
558 {
559 ret = 1;
560 goto fail;
561 }
562
563 if( verbose != 0 )
564 mbedtls_printf( "passed\n" );
565 }
566
567 if( verbose != 0 )
568 mbedtls_printf( "\n" );
569
570 goto exit;
571
572fail:
573 if( verbose != 0 )
574 mbedtls_printf( "failed\n" );
575
576exit:
577 mbedtls_sha256_free( &ctx );
578 mbedtls_free( buf );
579
580 return( ret );
581}
582
583#endif /* MBEDTLS_SELF_TEST */
584
585#endif /* MBEDTLS_SHA256_C */
Note: See TracBrowser for help on using the repository browser.