Blender V4.3
md5.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 1999, 2002 Aladdin Enterprises. All rights reserved.
2 *
3 * SPDX-License-Identifier: Zlib
4 *
5 * By `L. Peter Deutsch <ghost@aladdin.com>`. */
6
7/* Minor modifications done to remove some code and change style. */
8
9#include "util/md5.h"
10#include "util/path.h"
11
12#include <stdio.h>
13#include <string.h>
14
16
17#define T_MASK ((uint32_t)~0)
18#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
19#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
20#define T3 0x242070db
21#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
22#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
23#define T6 0x4787c62a
24#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
25#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
26#define T9 0x698098d8
27#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
28#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
29#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
30#define T13 0x6b901122
31#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
32#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
33#define T16 0x49b40821
34#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
35#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
36#define T19 0x265e5a51
37#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
38#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
39#define T22 0x02441453
40#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
41#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
42#define T25 0x21e1cde6
43#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
44#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
45#define T28 0x455a14ed
46#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
47#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
48#define T31 0x676f02d9
49#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
50#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
51#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
52#define T35 0x6d9d6122
53#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
54#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
55#define T38 0x4bdecfa9
56#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
57#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
58#define T41 0x289b7ec6
59#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
60#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
61#define T44 0x04881d05
62#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
63#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
64#define T47 0x1fa27cf8
65#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
66#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
67#define T50 0x432aff97
68#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
69#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
70#define T53 0x655b59c3
71#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
72#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
73#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
74#define T57 0x6fa87e4f
75#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
76#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
77#define T60 0x4e0811a1
78#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
79#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
80#define T63 0x2ad7d2bb
81#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
82
83void MD5Hash::process(const uint8_t *data /*[64]*/)
84{
85 uint32_t a = abcd[0], b = abcd[1], c = abcd[2], d = abcd[3];
86 uint32_t t;
87 /* Define storage for little-endian or both types of CPUs. */
88 uint32_t xbuf[16];
89 const uint32_t *X;
90
91 {
92 /*
93 * Determine dynamically whether this is a big-endian or
94 * little-endian machine, since we can use a more efficient
95 * algorithm on the latter.
96 */
97 static const int w = 1;
98
99 if (*((const uint8_t *)&w)) /* dynamic little-endian */ {
100 /*
101 * On little-endian machines, we can process properly aligned
102 * data without copying it.
103 */
104 if (!((data - (const uint8_t *)0) & 3)) {
105 /* data are properly aligned */
106 X = (const uint32_t *)data;
107 }
108 else {
109 /* not aligned */
110 memcpy(xbuf, data, 64);
111 X = xbuf;
112 }
113 }
114 else { /* dynamic big-endian */
115 /*
116 * On big-endian machines, we must arrange the bytes in the
117 * right order.
118 */
119 const uint8_t *xp = data;
120 int i;
121
122 X = xbuf; /* (dynamic only) */
123 for (i = 0; i < 16; ++i, xp += 4) {
124 xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
125 }
126 }
127 }
128
129#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
130
131 /* Round 1. */
132 /* Let [abcd k s i] denote the operation
133 * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
134#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
135#define SET(a, b, c, d, k, s, Ti) \
136 t = a + F(b, c, d) + X[k] + Ti; \
137 a = ROTATE_LEFT(t, s) + b
138 /* Do the following 16 operations. */
139 SET(a, b, c, d, 0, 7, T1);
140 SET(d, a, b, c, 1, 12, T2);
141 SET(c, d, a, b, 2, 17, T3);
142 SET(b, c, d, a, 3, 22, T4);
143 SET(a, b, c, d, 4, 7, T5);
144 SET(d, a, b, c, 5, 12, T6);
145 SET(c, d, a, b, 6, 17, T7);
146 SET(b, c, d, a, 7, 22, T8);
147 SET(a, b, c, d, 8, 7, T9);
148 SET(d, a, b, c, 9, 12, T10);
149 SET(c, d, a, b, 10, 17, T11);
150 SET(b, c, d, a, 11, 22, T12);
151 SET(a, b, c, d, 12, 7, T13);
152 SET(d, a, b, c, 13, 12, T14);
153 SET(c, d, a, b, 14, 17, T15);
154 SET(b, c, d, a, 15, 22, T16);
155#undef SET
156
157 /* Round 2. */
158 /* Let [abcd k s i] denote the operation
159 * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
160#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
161#define SET(a, b, c, d, k, s, Ti) \
162 t = a + G(b, c, d) + X[k] + Ti; \
163 a = ROTATE_LEFT(t, s) + b
164 /* Do the following 16 operations. */
165 SET(a, b, c, d, 1, 5, T17);
166 SET(d, a, b, c, 6, 9, T18);
167 SET(c, d, a, b, 11, 14, T19);
168 SET(b, c, d, a, 0, 20, T20);
169 SET(a, b, c, d, 5, 5, T21);
170 SET(d, a, b, c, 10, 9, T22);
171 SET(c, d, a, b, 15, 14, T23);
172 SET(b, c, d, a, 4, 20, T24);
173 SET(a, b, c, d, 9, 5, T25);
174 SET(d, a, b, c, 14, 9, T26);
175 SET(c, d, a, b, 3, 14, T27);
176 SET(b, c, d, a, 8, 20, T28);
177 SET(a, b, c, d, 13, 5, T29);
178 SET(d, a, b, c, 2, 9, T30);
179 SET(c, d, a, b, 7, 14, T31);
180 SET(b, c, d, a, 12, 20, T32);
181#undef SET
182
183 /* Round 3. */
184 /* Let [abcd k s t] denote the operation
185 * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
186#define H(x, y, z) ((x) ^ (y) ^ (z))
187#define SET(a, b, c, d, k, s, Ti) \
188 t = a + H(b, c, d) + X[k] + Ti; \
189 a = ROTATE_LEFT(t, s) + b
190 /* Do the following 16 operations. */
191 SET(a, b, c, d, 5, 4, T33);
192 SET(d, a, b, c, 8, 11, T34);
193 SET(c, d, a, b, 11, 16, T35);
194 SET(b, c, d, a, 14, 23, T36);
195 SET(a, b, c, d, 1, 4, T37);
196 SET(d, a, b, c, 4, 11, T38);
197 SET(c, d, a, b, 7, 16, T39);
198 SET(b, c, d, a, 10, 23, T40);
199 SET(a, b, c, d, 13, 4, T41);
200 SET(d, a, b, c, 0, 11, T42);
201 SET(c, d, a, b, 3, 16, T43);
202 SET(b, c, d, a, 6, 23, T44);
203 SET(a, b, c, d, 9, 4, T45);
204 SET(d, a, b, c, 12, 11, T46);
205 SET(c, d, a, b, 15, 16, T47);
206 SET(b, c, d, a, 2, 23, T48);
207#undef SET
208
209 /* Round 4. */
210 /* Let [abcd k s t] denote the operation
211 * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
212#define I(x, y, z) ((y) ^ ((x) | ~(z)))
213#define SET(a, b, c, d, k, s, Ti) \
214 t = a + I(b, c, d) + X[k] + Ti; \
215 a = ROTATE_LEFT(t, s) + b
216 /* Do the following 16 operations. */
217 SET(a, b, c, d, 0, 6, T49);
218 SET(d, a, b, c, 7, 10, T50);
219 SET(c, d, a, b, 14, 15, T51);
220 SET(b, c, d, a, 5, 21, T52);
221 SET(a, b, c, d, 12, 6, T53);
222 SET(d, a, b, c, 3, 10, T54);
223 SET(c, d, a, b, 10, 15, T55);
224 SET(b, c, d, a, 1, 21, T56);
225 SET(a, b, c, d, 8, 6, T57);
226 SET(d, a, b, c, 15, 10, T58);
227 SET(c, d, a, b, 6, 15, T59);
228 SET(b, c, d, a, 13, 21, T60);
229 SET(a, b, c, d, 4, 6, T61);
230 SET(d, a, b, c, 11, 10, T62);
231 SET(c, d, a, b, 2, 15, T63);
232 SET(b, c, d, a, 9, 21, T64);
233#undef SET
234
235 /* Then perform the following additions. (That is increment each
236 * of the four registers by the value it had before this block
237 * was started.) */
238 abcd[0] += a;
239 abcd[1] += b;
240 abcd[2] += c;
241 abcd[3] += d;
242}
243
245{
246 count[0] = count[1] = 0;
247 abcd[0] = 0x67452301;
248 abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
249 abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
250 abcd[3] = 0x10325476;
251}
252
254
255void MD5Hash::append(const uint8_t *data, int nbytes)
256{
257 const uint8_t *p = data;
258 int left = nbytes;
259 int offset = (count[0] >> 3) & 63;
260 uint32_t nbits = (uint32_t)(nbytes << 3);
261
262 if (nbytes <= 0) {
263 return;
264 }
265
266 /* Update the message length. */
267 count[1] += nbytes >> 29;
268 count[0] += nbits;
269 if (count[0] < nbits) {
270 count[1]++;
271 }
272
273 /* Process an initial partial block. */
274 if (offset) {
275 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
276
277 memcpy(buf + offset, p, copy);
278 if (offset + copy < 64) {
279 return;
280 }
281 p += copy;
282 left -= copy;
283 process(buf);
284 }
285
286 /* Process full blocks. */
287 for (; left >= 64; p += 64, left -= 64) {
288 process(p);
289 }
290
291 /* Process a final partial block. */
292 if (left) {
293 memcpy(buf, p, left);
294 }
295}
296
297void MD5Hash::append(const string &str)
298{
299 if (str.size()) {
300 append((const uint8_t *)str.c_str(), str.size());
301 }
302}
303
304bool MD5Hash::append_file(const string &filepath)
305{
306 FILE *f = path_fopen(filepath, "rb");
307
308 if (!f) {
309 fprintf(stderr, "MD5: failed to open file %s\n", filepath.c_str());
310 return false;
311 }
312
313 const size_t buffer_size = 1024;
314 uint8_t buffer[buffer_size];
315 size_t n;
316
317 do {
318 n = fread(buffer, 1, buffer_size, f);
319 append(buffer, n);
320 } while (n == buffer_size);
321
322 bool success = (ferror(f) == 0);
323
324 fclose(f);
325
326 return success;
327}
328
329void MD5Hash::finish(uint8_t digest[16])
330{
331 static const uint8_t pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
333 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
335
336 uint8_t data[8];
337 int i;
338
339 /* Save the length before padding. */
340 for (i = 0; i < 8; ++i) {
341 data[i] = (uint8_t)(count[i >> 2] >> ((i & 3) << 3));
342 }
343
344 /* Pad to 56 bytes mod 64. */
345 append(pad, ((55 - (count[0] >> 3)) & 63) + 1);
346 /* Append the length. */
347 append(data, 8);
348
349 for (i = 0; i < 16; ++i) {
350 digest[i] = (uint8_t)(abcd[i >> 2] >> ((i & 3) << 3));
351 }
352}
353
355{
356 constexpr char kHexDigits[] = {
357 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
358
359 uint8_t digest[16];
360 char buf[16 * 2 + 1];
361
362 finish(digest);
363
364 for (int i = 0; i < 16; i++) {
365 buf[i * 2 + 0] = kHexDigits[digest[i] / 0x10];
366 buf[i * 2 + 1] = kHexDigits[digest[i] % 0x10];
367 }
368 buf[sizeof(buf) - 1] = '\0';
369
370 return string(buf);
371}
372
373string util_md5_string(const string &str)
374{
375 MD5Hash md5;
376 md5.append((uint8_t *)str.c_str(), str.size());
377 return md5.get_hex();
378}
379
#define X
int pad[32 - sizeof(int)]
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
Definition md5.h:21
bool append_file(const string &filepath)
Definition md5.cpp:304
string get_hex()
Definition md5.cpp:354
uint8_t buf[64]
Definition md5.h:37
~MD5Hash()
Definition md5.cpp:253
void finish(uint8_t digest[16])
Definition md5.cpp:329
MD5Hash()
Definition md5.cpp:244
void append(const uint8_t *data, int size)
Definition md5.cpp:255
void process(const uint8_t *data)
Definition md5.cpp:83
uint32_t abcd[4]
Definition md5.h:36
uint32_t count[2]
Definition md5.h:35
local_group_size(16, 16) .push_constant(Type b
append
#define CCL_NAMESPACE_END
#define str(s)
#define T51
Definition md5.cpp:68
#define T46
Definition md5.cpp:63
#define T50
Definition md5.cpp:67
#define T45
Definition md5.cpp:62
#define T56
Definition md5.cpp:73
#define T17
Definition md5.cpp:34
#define T54
Definition md5.cpp:71
#define T20
Definition md5.cpp:37
#define T43
Definition md5.cpp:60
#define T9
Definition md5.cpp:26
#define T14
Definition md5.cpp:31
#define T57
Definition md5.cpp:74
#define T37
Definition md5.cpp:54
#define T2
Definition md5.cpp:19
#define T_MASK
Definition md5.cpp:17
#define T7
Definition md5.cpp:24
#define T61
Definition md5.cpp:78
#define T10
Definition md5.cpp:27
#define T31
Definition md5.cpp:48
#define T62
Definition md5.cpp:79
#define T26
Definition md5.cpp:43
#define T24
Definition md5.cpp:41
#define T44
Definition md5.cpp:61
#define T25
Definition md5.cpp:42
#define T36
Definition md5.cpp:53
#define T18
Definition md5.cpp:35
#define T21
Definition md5.cpp:38
#define T6
Definition md5.cpp:23
#define T3
Definition md5.cpp:20
#define T58
Definition md5.cpp:75
#define SET(a, b, c, d, k, s, Ti)
#define T29
Definition md5.cpp:46
#define T60
Definition md5.cpp:77
#define T59
Definition md5.cpp:76
#define T5
Definition md5.cpp:22
#define T53
Definition md5.cpp:70
#define T39
Definition md5.cpp:56
#define T38
Definition md5.cpp:55
#define T19
Definition md5.cpp:36
#define T33
Definition md5.cpp:50
#define T49
Definition md5.cpp:66
#define T16
Definition md5.cpp:33
#define T22
Definition md5.cpp:39
#define T55
Definition md5.cpp:72
#define T41
Definition md5.cpp:58
#define T48
Definition md5.cpp:65
#define T4
Definition md5.cpp:21
#define T64
Definition md5.cpp:81
#define T40
Definition md5.cpp:57
#define T47
Definition md5.cpp:64
#define T13
Definition md5.cpp:30
#define T30
Definition md5.cpp:47
#define T11
Definition md5.cpp:28
#define T63
Definition md5.cpp:80
#define T1
Definition md5.cpp:18
#define T35
Definition md5.cpp:52
string util_md5_string(const string &str)
Definition md5.cpp:373
#define T8
Definition md5.cpp:25
#define T23
Definition md5.cpp:40
#define T42
Definition md5.cpp:59
#define T15
Definition md5.cpp:32
#define T34
Definition md5.cpp:51
#define T27
Definition md5.cpp:44
#define T28
Definition md5.cpp:45
#define T52
Definition md5.cpp:69
#define T32
Definition md5.cpp:49
#define T12
Definition md5.cpp:29
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
FILE * path_fopen(const string &path, const string &mode)
Definition path.cpp:973
unsigned int uint32_t
Definition stdint.h:80
unsigned char uint8_t
Definition stdint.h:78