Coverage Report

Created: 2025-08-26 06:44

/src/minizip-ng/mz_crypt.c
Line
Count
Source (jump to first uncovered line)
1
/* mz_crypt.c -- Crypto/hash functions
2
   part of the minizip-ng project
3
4
   Copyright (C) Nathan Moinvaziri
5
     https://github.com/zlib-ng/minizip-ng
6
7
   This program is distributed under the terms of the same license as zlib.
8
   See the accompanying LICENSE file for the full text of the license.
9
*/
10
11
#include "mz.h"
12
#include "mz_os.h"
13
#include "mz_crypt.h"
14
15
#if defined(HAVE_ZLIB)
16
#  if !defined(ZLIB_COMPAT)
17
#    include "zlib-ng.h"
18
#    define ZLIB_PREFIX(x) zng_##x
19
#  else
20
#    include "zlib.h"
21
#    define ZLIB_PREFIX(x) x
22
#  endif
23
#elif defined(HAVE_LZMA)
24
#  include "lzma.h"
25
#endif
26
27
/***************************************************************************/
28
29
#if defined(MZ_ZIP_NO_CRYPTO)
30
int32_t mz_crypt_rand(uint8_t *buf, int32_t size) {
31
    return mz_os_rand(buf, size);
32
}
33
#endif
34
35
2.63M
uint32_t mz_crypt_crc32_update(uint32_t value, const uint8_t *buf, int32_t size) {
36
#if defined(HAVE_ZLIB)
37
#  ifndef ZLIB_VERNUM
38
    /* HAVE_ZLIB but no ZLIB_VERNUM? */
39
    typedef uint32_t z_crc_t;
40
#  elif (ZLIB_VERNUM & 0xf != 0xf) && (ZLIB_VERNUM < 0x1270)
41
    /* Define z_crc_t in zlib 1.2.6 and less */
42
    typedef unsigned long z_crc_t;
43
#  elif (ZLIB_VERNUM & 0xf == 0xf) && (ZLIB_VERNUM < 0x12df)
44
    /* Define z_crc_t in zlib-ng 2.0.7 and less */
45
    typedef unsigned int z_crc_t;
46
#  endif
47
    return (uint32_t)ZLIB_PREFIX(crc32)((z_crc_t)value, buf, (uInt)size);
48
#elif defined(HAVE_LZMA)
49
    return (uint32_t)lzma_crc32(buf, (size_t)size, (uint32_t)value);
50
#else
51
2.63M
    static uint32_t crc32_table[256] = {
52
2.63M
        0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832,
53
2.63M
        0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
54
2.63M
        0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a,
55
2.63M
        0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
56
2.63M
        0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
57
2.63M
        0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
58
2.63M
        0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,
59
2.63M
        0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
60
2.63M
        0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
61
2.63M
        0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
62
2.63M
        0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074,
63
2.63M
        0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
64
2.63M
        0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525,
65
2.63M
        0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
66
2.63M
        0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
67
2.63M
        0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
68
2.63M
        0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76,
69
2.63M
        0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
70
2.63M
        0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
71
2.63M
        0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
72
2.63M
        0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
73
2.63M
        0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
74
2.63M
        0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7,
75
2.63M
        0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
76
2.63M
        0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
77
2.63M
        0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
78
2.63M
        0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330,
79
2.63M
        0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
80
2.63M
        0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
81
2.63M
    value = ~value;
82
83
16.7M
    while (size > 0) {
84
14.1M
        value = (value >> 8) ^ crc32_table[(value ^ *buf) & 0xFF];
85
86
14.1M
        buf += 1;
87
14.1M
        size -= 1;
88
14.1M
    }
89
90
2.63M
    return ~value;
91
2.63M
#endif
92
2.63M
}
93
94
#if defined(HAVE_WZAES)
95
int32_t mz_crypt_pbkdf2(uint8_t *password, int32_t password_length, uint8_t *salt, int32_t salt_length,
96
13.6k
                        uint32_t iteration_count, uint8_t *key, uint16_t key_length) {
97
13.6k
    void *hmac1 = NULL;
98
13.6k
    void *hmac2 = NULL;
99
13.6k
    void *hmac3 = NULL;
100
13.6k
    int32_t err = MZ_OK;
101
13.6k
    uint16_t i = 0;
102
13.6k
    uint32_t j = 0;
103
13.6k
    uint16_t k = 0;
104
13.6k
    uint16_t block_count = 0;
105
13.6k
    uint8_t uu[MZ_HASH_SHA1_SIZE];
106
13.6k
    uint8_t ux[MZ_HASH_SHA1_SIZE];
107
108
13.6k
    if (!password || !salt || !key)
109
0
        return MZ_PARAM_ERROR;
110
111
13.6k
    memset(key, 0, key_length);
112
113
13.6k
    hmac1 = mz_crypt_hmac_create();
114
13.6k
    hmac2 = mz_crypt_hmac_create();
115
13.6k
    hmac3 = mz_crypt_hmac_create();
116
117
13.6k
    if (!hmac1 || !hmac2 || !hmac3) {
118
0
        err = MZ_MEM_ERROR;
119
0
        goto pbkdf2_cleanup;
120
0
    }
121
122
13.6k
    mz_crypt_hmac_set_algorithm(hmac1, MZ_HASH_SHA1);
123
13.6k
    mz_crypt_hmac_set_algorithm(hmac2, MZ_HASH_SHA1);
124
13.6k
    mz_crypt_hmac_set_algorithm(hmac3, MZ_HASH_SHA1);
125
126
13.6k
    err = mz_crypt_hmac_init(hmac1, password, password_length);
127
13.6k
    if (err == MZ_OK)
128
13.6k
        err = mz_crypt_hmac_init(hmac2, password, password_length);
129
13.6k
    if (err == MZ_OK)
130
13.6k
        err = mz_crypt_hmac_update(hmac2, salt, salt_length);
131
132
13.6k
    block_count = 1 + ((uint16_t)key_length - 1) / MZ_HASH_SHA1_SIZE;
133
134
43.0k
    for (i = 0; (err == MZ_OK) && (i < block_count); i += 1) {
135
29.3k
        memset(ux, 0, sizeof(ux));
136
137
29.3k
        err = mz_crypt_hmac_copy(hmac2, hmac3);
138
29.3k
        if (err != MZ_OK)
139
0
            break;
140
141
29.3k
        uu[0] = (uint8_t)((i + 1) >> 24);
142
29.3k
        uu[1] = (uint8_t)((i + 1) >> 16);
143
29.3k
        uu[2] = (uint8_t)((i + 1) >> 8);
144
29.3k
        uu[3] = (uint8_t)(i + 1);
145
146
29.3M
        for (j = 0, k = 4; j < iteration_count; j += 1) {
147
29.3M
            err = mz_crypt_hmac_update(hmac3, uu, k);
148
29.3M
            if (err == MZ_OK)
149
29.3M
                err = mz_crypt_hmac_end(hmac3, uu, sizeof(uu));
150
29.3M
            if (err != MZ_OK)
151
0
                break;
152
153
615M
            for (k = 0; k < MZ_HASH_SHA1_SIZE; k += 1)
154
586M
                ux[k] ^= uu[k];
155
156
29.3M
            err = mz_crypt_hmac_copy(hmac1, hmac3);
157
29.3M
            if (err != MZ_OK)
158
0
                break;
159
29.3M
        }
160
161
29.3k
        if (err != MZ_OK)
162
0
            break;
163
164
29.3k
        j = 0;
165
29.3k
        k = i * MZ_HASH_SHA1_SIZE;
166
167
525k
        while (j < MZ_HASH_SHA1_SIZE && k < key_length)
168
496k
            key[k++] = ux[j++];
169
29.3k
    }
170
171
13.6k
pbkdf2_cleanup:
172
    /* hmac3 uses the same provider as hmac2, so it must be deleted
173
       before the context is destroyed. */
174
13.6k
    mz_crypt_hmac_delete(&hmac3);
175
13.6k
    mz_crypt_hmac_delete(&hmac1);
176
13.6k
    mz_crypt_hmac_delete(&hmac2);
177
178
13.6k
    return err;
179
13.6k
}
180
#endif
181
182
/***************************************************************************/