Coverage Report

Created: 2023-08-19 20:41

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