Coverage Report

Created: 2026-01-17 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/minizip-ng/mz_crypt.c
Line
Count
Source
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.31M
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.31M
    static uint32_t crc32_table[256] = {
52
2.31M
        0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832,
53
2.31M
        0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
54
2.31M
        0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a,
55
2.31M
        0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
56
2.31M
        0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
57
2.31M
        0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
58
2.31M
        0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,
59
2.31M
        0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
60
2.31M
        0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
61
2.31M
        0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
62
2.31M
        0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074,
63
2.31M
        0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
64
2.31M
        0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525,
65
2.31M
        0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
66
2.31M
        0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
67
2.31M
        0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
68
2.31M
        0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76,
69
2.31M
        0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
70
2.31M
        0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
71
2.31M
        0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
72
2.31M
        0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
73
2.31M
        0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
74
2.31M
        0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7,
75
2.31M
        0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
76
2.31M
        0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
77
2.31M
        0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
78
2.31M
        0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330,
79
2.31M
        0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
80
2.31M
        0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
81
2.31M
    value = ~value;
82
83
14.6M
    while (size > 0) {
84
12.3M
        value = (value >> 8) ^ crc32_table[(value ^ *buf) & 0xFF];
85
86
12.3M
        buf += 1;
87
12.3M
        size -= 1;
88
12.3M
    }
89
90
2.31M
    return ~value;
91
2.31M
#endif
92
2.31M
}
93
94
#if defined(HAVE_WZAES)
95
int32_t mz_crypt_pbkdf2(const uint8_t *password, int32_t password_length, const uint8_t *salt, int32_t salt_length,
96
13.8k
                        uint32_t iteration_count, uint8_t *key, uint16_t key_length) {
97
13.8k
    void *hmac1 = NULL;
98
13.8k
    void *hmac2 = NULL;
99
13.8k
    void *hmac3 = NULL;
100
13.8k
    int32_t err = MZ_OK;
101
13.8k
    uint16_t i = 0;
102
13.8k
    uint32_t j = 0;
103
13.8k
    uint16_t k = 0;
104
13.8k
    uint16_t block_count = 0;
105
13.8k
    uint8_t uu[MZ_HASH_SHA1_SIZE];
106
13.8k
    uint8_t ux[MZ_HASH_SHA1_SIZE];
107
108
13.8k
    if (!password || !salt || !key)
109
0
        return MZ_PARAM_ERROR;
110
111
13.8k
    memset(key, 0, key_length);
112
113
13.8k
    hmac1 = mz_crypt_hmac_create();
114
13.8k
    hmac2 = mz_crypt_hmac_create();
115
13.8k
    hmac3 = mz_crypt_hmac_create();
116
117
13.8k
    if (!hmac1 || !hmac2 || !hmac3) {
118
0
        err = MZ_MEM_ERROR;
119
0
        goto pbkdf2_cleanup;
120
0
    }
121
122
13.8k
    mz_crypt_hmac_set_algorithm(hmac1, MZ_HASH_SHA1);
123
13.8k
    mz_crypt_hmac_set_algorithm(hmac2, MZ_HASH_SHA1);
124
13.8k
    mz_crypt_hmac_set_algorithm(hmac3, MZ_HASH_SHA1);
125
126
13.8k
    err = mz_crypt_hmac_init(hmac1, password, password_length);
127
13.8k
    if (err == MZ_OK)
128
13.8k
        err = mz_crypt_hmac_init(hmac2, password, password_length);
129
13.8k
    if (err == MZ_OK)
130
13.8k
        err = mz_crypt_hmac_update(hmac2, salt, salt_length);
131
132
13.8k
    block_count = 1 + ((uint16_t)key_length - 1) / MZ_HASH_SHA1_SIZE;
133
134
44.0k
    for (i = 0; (err == MZ_OK) && (i < block_count); i += 1) {
135
30.2k
        memset(ux, 0, sizeof(ux));
136
137
30.2k
        err = mz_crypt_hmac_copy(hmac2, hmac3);
138
30.2k
        if (err != MZ_OK)
139
0
            break;
140
141
30.2k
        uu[0] = (uint8_t)((i + 1) >> 24);
142
30.2k
        uu[1] = (uint8_t)((i + 1) >> 16);
143
30.2k
        uu[2] = (uint8_t)((i + 1) >> 8);
144
30.2k
        uu[3] = (uint8_t)(i + 1);
145
146
30.2M
        for (j = 0, k = 4; j < iteration_count; j += 1) {
147
30.2M
            err = mz_crypt_hmac_update(hmac3, uu, k);
148
30.2M
            if (err == MZ_OK)
149
30.2M
                err = mz_crypt_hmac_end(hmac3, uu, sizeof(uu));
150
30.2M
            if (err != MZ_OK)
151
0
                break;
152
153
634M
            for (k = 0; k < MZ_HASH_SHA1_SIZE; k += 1)
154
604M
                ux[k] ^= uu[k];
155
156
30.2M
            err = mz_crypt_hmac_copy(hmac1, hmac3);
157
30.2M
            if (err != MZ_OK)
158
0
                break;
159
30.2M
        }
160
161
30.2k
        if (err != MZ_OK)
162
0
            break;
163
164
30.2k
        j = 0;
165
30.2k
        k = i * MZ_HASH_SHA1_SIZE;
166
167
541k
        while (j < MZ_HASH_SHA1_SIZE && k < key_length)
168
511k
            key[k++] = ux[j++];
169
30.2k
    }
170
171
13.8k
pbkdf2_cleanup:
172
    /* hmac3 uses the same provider as hmac2, so it must be deleted
173
       before the context is destroyed. */
174
13.8k
    mz_crypt_hmac_delete(&hmac3);
175
13.8k
    mz_crypt_hmac_delete(&hmac1);
176
13.8k
    mz_crypt_hmac_delete(&hmac2);
177
178
13.8k
    return err;
179
13.8k
}
180
#endif
181
182
/***************************************************************************/