quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

sha1.c (14189B)


      1 /*
      2  *  FIPS-180-1 compliant SHA-1 implementation
      3  *
      4  *  Copyright The Mbed TLS Contributors
      5  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      6  */
      7 /*
      8  *  The SHA-1 standard was published by NIST in 1993.
      9  *
     10  *  http://www.itl.nist.gov/fipspubs/fip180-1.htm
     11  */
     12 
     13 #include "common.h"
     14 
     15 #if defined(MBEDTLS_SHA1_C)
     16 
     17 #include "mbedtls/sha1.h"
     18 #include "mbedtls/platform_util.h"
     19 #include "mbedtls/error.h"
     20 
     21 #include <string.h>
     22 
     23 #include "mbedtls/platform.h"
     24 
     25 #if !defined(MBEDTLS_SHA1_ALT)
     26 
     27 void mbedtls_sha1_init(mbedtls_sha1_context *ctx)
     28 {
     29     memset(ctx, 0, sizeof(mbedtls_sha1_context));
     30 }
     31 
     32 void mbedtls_sha1_free(mbedtls_sha1_context *ctx)
     33 {
     34     if (ctx == NULL) {
     35         return;
     36     }
     37 
     38     mbedtls_platform_zeroize(ctx, sizeof(mbedtls_sha1_context));
     39 }
     40 
     41 void mbedtls_sha1_clone(mbedtls_sha1_context *dst,
     42                         const mbedtls_sha1_context *src)
     43 {
     44     *dst = *src;
     45 }
     46 
     47 /*
     48  * SHA-1 context setup
     49  */
     50 int mbedtls_sha1_starts(mbedtls_sha1_context *ctx)
     51 {
     52     ctx->total[0] = 0;
     53     ctx->total[1] = 0;
     54 
     55     ctx->state[0] = 0x67452301;
     56     ctx->state[1] = 0xEFCDAB89;
     57     ctx->state[2] = 0x98BADCFE;
     58     ctx->state[3] = 0x10325476;
     59     ctx->state[4] = 0xC3D2E1F0;
     60 
     61     return 0;
     62 }
     63 
     64 #if !defined(MBEDTLS_SHA1_PROCESS_ALT)
     65 int mbedtls_internal_sha1_process(mbedtls_sha1_context *ctx,
     66                                   const unsigned char data[64])
     67 {
     68     struct {
     69         uint32_t temp, W[16], A, B, C, D, E;
     70     } local;
     71 
     72     local.W[0] = MBEDTLS_GET_UINT32_BE(data,  0);
     73     local.W[1] = MBEDTLS_GET_UINT32_BE(data,  4);
     74     local.W[2] = MBEDTLS_GET_UINT32_BE(data,  8);
     75     local.W[3] = MBEDTLS_GET_UINT32_BE(data, 12);
     76     local.W[4] = MBEDTLS_GET_UINT32_BE(data, 16);
     77     local.W[5] = MBEDTLS_GET_UINT32_BE(data, 20);
     78     local.W[6] = MBEDTLS_GET_UINT32_BE(data, 24);
     79     local.W[7] = MBEDTLS_GET_UINT32_BE(data, 28);
     80     local.W[8] = MBEDTLS_GET_UINT32_BE(data, 32);
     81     local.W[9] = MBEDTLS_GET_UINT32_BE(data, 36);
     82     local.W[10] = MBEDTLS_GET_UINT32_BE(data, 40);
     83     local.W[11] = MBEDTLS_GET_UINT32_BE(data, 44);
     84     local.W[12] = MBEDTLS_GET_UINT32_BE(data, 48);
     85     local.W[13] = MBEDTLS_GET_UINT32_BE(data, 52);
     86     local.W[14] = MBEDTLS_GET_UINT32_BE(data, 56);
     87     local.W[15] = MBEDTLS_GET_UINT32_BE(data, 60);
     88 
     89 #define S(x, n) (((x) << (n)) | (((x) & 0xFFFFFFFF) >> (32 - (n))))
     90 
     91 #define R(t)                                                    \
     92     (                                                           \
     93         local.temp = local.W[((t) -  3) & 0x0F] ^             \
     94                      local.W[((t) -  8) & 0x0F] ^             \
     95                      local.W[((t) - 14) & 0x0F] ^             \
     96                      local.W[(t)        & 0x0F],              \
     97         (local.W[(t) & 0x0F] = S(local.temp, 1))               \
     98     )
     99 
    100 #define P(a, b, c, d, e, x)                                          \
    101     do                                                          \
    102     {                                                           \
    103         (e) += S((a), 5) + F((b), (c), (d)) + K + (x);             \
    104         (b) = S((b), 30);                                        \
    105     } while (0)
    106 
    107     local.A = ctx->state[0];
    108     local.B = ctx->state[1];
    109     local.C = ctx->state[2];
    110     local.D = ctx->state[3];
    111     local.E = ctx->state[4];
    112 
    113 #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
    114 #define K 0x5A827999
    115 
    116     P(local.A, local.B, local.C, local.D, local.E, local.W[0]);
    117     P(local.E, local.A, local.B, local.C, local.D, local.W[1]);
    118     P(local.D, local.E, local.A, local.B, local.C, local.W[2]);
    119     P(local.C, local.D, local.E, local.A, local.B, local.W[3]);
    120     P(local.B, local.C, local.D, local.E, local.A, local.W[4]);
    121     P(local.A, local.B, local.C, local.D, local.E, local.W[5]);
    122     P(local.E, local.A, local.B, local.C, local.D, local.W[6]);
    123     P(local.D, local.E, local.A, local.B, local.C, local.W[7]);
    124     P(local.C, local.D, local.E, local.A, local.B, local.W[8]);
    125     P(local.B, local.C, local.D, local.E, local.A, local.W[9]);
    126     P(local.A, local.B, local.C, local.D, local.E, local.W[10]);
    127     P(local.E, local.A, local.B, local.C, local.D, local.W[11]);
    128     P(local.D, local.E, local.A, local.B, local.C, local.W[12]);
    129     P(local.C, local.D, local.E, local.A, local.B, local.W[13]);
    130     P(local.B, local.C, local.D, local.E, local.A, local.W[14]);
    131     P(local.A, local.B, local.C, local.D, local.E, local.W[15]);
    132     P(local.E, local.A, local.B, local.C, local.D, R(16));
    133     P(local.D, local.E, local.A, local.B, local.C, R(17));
    134     P(local.C, local.D, local.E, local.A, local.B, R(18));
    135     P(local.B, local.C, local.D, local.E, local.A, R(19));
    136 
    137 #undef K
    138 #undef F
    139 
    140 #define F(x, y, z) ((x) ^ (y) ^ (z))
    141 #define K 0x6ED9EBA1
    142 
    143     P(local.A, local.B, local.C, local.D, local.E, R(20));
    144     P(local.E, local.A, local.B, local.C, local.D, R(21));
    145     P(local.D, local.E, local.A, local.B, local.C, R(22));
    146     P(local.C, local.D, local.E, local.A, local.B, R(23));
    147     P(local.B, local.C, local.D, local.E, local.A, R(24));
    148     P(local.A, local.B, local.C, local.D, local.E, R(25));
    149     P(local.E, local.A, local.B, local.C, local.D, R(26));
    150     P(local.D, local.E, local.A, local.B, local.C, R(27));
    151     P(local.C, local.D, local.E, local.A, local.B, R(28));
    152     P(local.B, local.C, local.D, local.E, local.A, R(29));
    153     P(local.A, local.B, local.C, local.D, local.E, R(30));
    154     P(local.E, local.A, local.B, local.C, local.D, R(31));
    155     P(local.D, local.E, local.A, local.B, local.C, R(32));
    156     P(local.C, local.D, local.E, local.A, local.B, R(33));
    157     P(local.B, local.C, local.D, local.E, local.A, R(34));
    158     P(local.A, local.B, local.C, local.D, local.E, R(35));
    159     P(local.E, local.A, local.B, local.C, local.D, R(36));
    160     P(local.D, local.E, local.A, local.B, local.C, R(37));
    161     P(local.C, local.D, local.E, local.A, local.B, R(38));
    162     P(local.B, local.C, local.D, local.E, local.A, R(39));
    163 
    164 #undef K
    165 #undef F
    166 
    167 #define F(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
    168 #define K 0x8F1BBCDC
    169 
    170     P(local.A, local.B, local.C, local.D, local.E, R(40));
    171     P(local.E, local.A, local.B, local.C, local.D, R(41));
    172     P(local.D, local.E, local.A, local.B, local.C, R(42));
    173     P(local.C, local.D, local.E, local.A, local.B, R(43));
    174     P(local.B, local.C, local.D, local.E, local.A, R(44));
    175     P(local.A, local.B, local.C, local.D, local.E, R(45));
    176     P(local.E, local.A, local.B, local.C, local.D, R(46));
    177     P(local.D, local.E, local.A, local.B, local.C, R(47));
    178     P(local.C, local.D, local.E, local.A, local.B, R(48));
    179     P(local.B, local.C, local.D, local.E, local.A, R(49));
    180     P(local.A, local.B, local.C, local.D, local.E, R(50));
    181     P(local.E, local.A, local.B, local.C, local.D, R(51));
    182     P(local.D, local.E, local.A, local.B, local.C, R(52));
    183     P(local.C, local.D, local.E, local.A, local.B, R(53));
    184     P(local.B, local.C, local.D, local.E, local.A, R(54));
    185     P(local.A, local.B, local.C, local.D, local.E, R(55));
    186     P(local.E, local.A, local.B, local.C, local.D, R(56));
    187     P(local.D, local.E, local.A, local.B, local.C, R(57));
    188     P(local.C, local.D, local.E, local.A, local.B, R(58));
    189     P(local.B, local.C, local.D, local.E, local.A, R(59));
    190 
    191 #undef K
    192 #undef F
    193 
    194 #define F(x, y, z) ((x) ^ (y) ^ (z))
    195 #define K 0xCA62C1D6
    196 
    197     P(local.A, local.B, local.C, local.D, local.E, R(60));
    198     P(local.E, local.A, local.B, local.C, local.D, R(61));
    199     P(local.D, local.E, local.A, local.B, local.C, R(62));
    200     P(local.C, local.D, local.E, local.A, local.B, R(63));
    201     P(local.B, local.C, local.D, local.E, local.A, R(64));
    202     P(local.A, local.B, local.C, local.D, local.E, R(65));
    203     P(local.E, local.A, local.B, local.C, local.D, R(66));
    204     P(local.D, local.E, local.A, local.B, local.C, R(67));
    205     P(local.C, local.D, local.E, local.A, local.B, R(68));
    206     P(local.B, local.C, local.D, local.E, local.A, R(69));
    207     P(local.A, local.B, local.C, local.D, local.E, R(70));
    208     P(local.E, local.A, local.B, local.C, local.D, R(71));
    209     P(local.D, local.E, local.A, local.B, local.C, R(72));
    210     P(local.C, local.D, local.E, local.A, local.B, R(73));
    211     P(local.B, local.C, local.D, local.E, local.A, R(74));
    212     P(local.A, local.B, local.C, local.D, local.E, R(75));
    213     P(local.E, local.A, local.B, local.C, local.D, R(76));
    214     P(local.D, local.E, local.A, local.B, local.C, R(77));
    215     P(local.C, local.D, local.E, local.A, local.B, R(78));
    216     P(local.B, local.C, local.D, local.E, local.A, R(79));
    217 
    218 #undef K
    219 #undef F
    220 
    221     ctx->state[0] += local.A;
    222     ctx->state[1] += local.B;
    223     ctx->state[2] += local.C;
    224     ctx->state[3] += local.D;
    225     ctx->state[4] += local.E;
    226 
    227     /* Zeroise buffers and variables to clear sensitive data from memory. */
    228     mbedtls_platform_zeroize(&local, sizeof(local));
    229 
    230     return 0;
    231 }
    232 
    233 #endif /* !MBEDTLS_SHA1_PROCESS_ALT */
    234 
    235 /*
    236  * SHA-1 process buffer
    237  */
    238 int mbedtls_sha1_update(mbedtls_sha1_context *ctx,
    239                         const unsigned char *input,
    240                         size_t ilen)
    241 {
    242     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    243     size_t fill;
    244     uint32_t left;
    245 
    246     if (ilen == 0) {
    247         return 0;
    248     }
    249 
    250     left = ctx->total[0] & 0x3F;
    251     fill = 64 - left;
    252 
    253     ctx->total[0] += (uint32_t) ilen;
    254     ctx->total[0] &= 0xFFFFFFFF;
    255 
    256     if (ctx->total[0] < (uint32_t) ilen) {
    257         ctx->total[1]++;
    258     }
    259 
    260     if (left && ilen >= fill) {
    261         memcpy((void *) (ctx->buffer + left), input, fill);
    262 
    263         if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) {
    264             return ret;
    265         }
    266 
    267         input += fill;
    268         ilen  -= fill;
    269         left = 0;
    270     }
    271 
    272     while (ilen >= 64) {
    273         if ((ret = mbedtls_internal_sha1_process(ctx, input)) != 0) {
    274             return ret;
    275         }
    276 
    277         input += 64;
    278         ilen  -= 64;
    279     }
    280 
    281     if (ilen > 0) {
    282         memcpy((void *) (ctx->buffer + left), input, ilen);
    283     }
    284 
    285     return 0;
    286 }
    287 
    288 /*
    289  * SHA-1 final digest
    290  */
    291 int mbedtls_sha1_finish(mbedtls_sha1_context *ctx,
    292                         unsigned char output[20])
    293 {
    294     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    295     uint32_t used;
    296     uint32_t high, low;
    297 
    298     /*
    299      * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
    300      */
    301     used = ctx->total[0] & 0x3F;
    302 
    303     ctx->buffer[used++] = 0x80;
    304 
    305     if (used <= 56) {
    306         /* Enough room for padding + length in current block */
    307         memset(ctx->buffer + used, 0, 56 - used);
    308     } else {
    309         /* We'll need an extra block */
    310         memset(ctx->buffer + used, 0, 64 - used);
    311 
    312         if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) {
    313             goto exit;
    314         }
    315 
    316         memset(ctx->buffer, 0, 56);
    317     }
    318 
    319     /*
    320      * Add message length
    321      */
    322     high = (ctx->total[0] >> 29)
    323            | (ctx->total[1] <<  3);
    324     low  = (ctx->total[0] <<  3);
    325 
    326     MBEDTLS_PUT_UINT32_BE(high, ctx->buffer, 56);
    327     MBEDTLS_PUT_UINT32_BE(low,  ctx->buffer, 60);
    328 
    329     if ((ret = mbedtls_internal_sha1_process(ctx, ctx->buffer)) != 0) {
    330         goto exit;
    331     }
    332 
    333     /*
    334      * Output final state
    335      */
    336     MBEDTLS_PUT_UINT32_BE(ctx->state[0], output,  0);
    337     MBEDTLS_PUT_UINT32_BE(ctx->state[1], output,  4);
    338     MBEDTLS_PUT_UINT32_BE(ctx->state[2], output,  8);
    339     MBEDTLS_PUT_UINT32_BE(ctx->state[3], output, 12);
    340     MBEDTLS_PUT_UINT32_BE(ctx->state[4], output, 16);
    341 
    342     ret = 0;
    343 
    344 exit:
    345     mbedtls_sha1_free(ctx);
    346     return ret;
    347 }
    348 
    349 #endif /* !MBEDTLS_SHA1_ALT */
    350 
    351 /*
    352  * output = SHA-1( input buffer )
    353  */
    354 int mbedtls_sha1(const unsigned char *input,
    355                  size_t ilen,
    356                  unsigned char output[20])
    357 {
    358     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    359     mbedtls_sha1_context ctx;
    360 
    361     mbedtls_sha1_init(&ctx);
    362 
    363     if ((ret = mbedtls_sha1_starts(&ctx)) != 0) {
    364         goto exit;
    365     }
    366 
    367     if ((ret = mbedtls_sha1_update(&ctx, input, ilen)) != 0) {
    368         goto exit;
    369     }
    370 
    371     if ((ret = mbedtls_sha1_finish(&ctx, output)) != 0) {
    372         goto exit;
    373     }
    374 
    375 exit:
    376     mbedtls_sha1_free(&ctx);
    377     return ret;
    378 }
    379 
    380 #if defined(MBEDTLS_SELF_TEST)
    381 /*
    382  * FIPS-180-1 test vectors
    383  */
    384 static const unsigned char sha1_test_buf[3][57] =
    385 {
    386     { "abc" },
    387     { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
    388     { "" }
    389 };
    390 
    391 static const size_t sha1_test_buflen[3] =
    392 {
    393     3, 56, 1000
    394 };
    395 
    396 static const unsigned char sha1_test_sum[3][20] =
    397 {
    398     { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
    399       0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
    400     { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
    401       0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
    402     { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
    403       0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
    404 };
    405 
    406 /*
    407  * Checkup routine
    408  */
    409 int mbedtls_sha1_self_test(int verbose)
    410 {
    411     int i, j, buflen, ret = 0;
    412     unsigned char buf[1024];
    413     unsigned char sha1sum[20];
    414     mbedtls_sha1_context ctx;
    415 
    416     mbedtls_sha1_init(&ctx);
    417 
    418     /*
    419      * SHA-1
    420      */
    421     for (i = 0; i < 3; i++) {
    422         if (verbose != 0) {
    423             mbedtls_printf("  SHA-1 test #%d: ", i + 1);
    424         }
    425 
    426         if ((ret = mbedtls_sha1_starts(&ctx)) != 0) {
    427             goto fail;
    428         }
    429 
    430         if (i == 2) {
    431             memset(buf, 'a', buflen = 1000);
    432 
    433             for (j = 0; j < 1000; j++) {
    434                 ret = mbedtls_sha1_update(&ctx, buf, buflen);
    435                 if (ret != 0) {
    436                     goto fail;
    437                 }
    438             }
    439         } else {
    440             ret = mbedtls_sha1_update(&ctx, sha1_test_buf[i],
    441                                       sha1_test_buflen[i]);
    442             if (ret != 0) {
    443                 goto fail;
    444             }
    445         }
    446 
    447         if ((ret = mbedtls_sha1_finish(&ctx, sha1sum)) != 0) {
    448             goto fail;
    449         }
    450 
    451         if (memcmp(sha1sum, sha1_test_sum[i], 20) != 0) {
    452             ret = 1;
    453             goto fail;
    454         }
    455 
    456         if (verbose != 0) {
    457             mbedtls_printf("passed\n");
    458         }
    459     }
    460 
    461     if (verbose != 0) {
    462         mbedtls_printf("\n");
    463     }
    464 
    465     goto exit;
    466 
    467 fail:
    468     if (verbose != 0) {
    469         mbedtls_printf("failed\n");
    470     }
    471 
    472 exit:
    473     mbedtls_sha1_free(&ctx);
    474 
    475     return ret;
    476 }
    477 
    478 #endif /* MBEDTLS_SELF_TEST */
    479 
    480 #endif /* MBEDTLS_SHA1_C */