Coverage Report

Created: 2025-10-12 06:30

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