Branch data Line data Source code
1 : : /* gchecksum.h - data hashing functions
2 : : *
3 : : * Copyright (C) 2007 Emmanuele Bassi <ebassi@gnome.org>
4 : : *
5 : : * SPDX-License-Identifier: LGPL-2.1-or-later
6 : : *
7 : : * This library is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU Lesser General Public
9 : : * License as published by the Free Software Foundation; either
10 : : * version 2.1 of the License, or (at your option) any later version.
11 : : *
12 : : * This library is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : * Lesser General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU Lesser General Public License
18 : : * along with this library; if not, see <http://www.gnu.org/licenses/>.
19 : : */
20 : :
21 : : #include "config.h"
22 : :
23 : : #include <string.h>
24 : :
25 : : #include "gchecksum.h"
26 : :
27 : : #include "gslice.h"
28 : : #include "gmem.h"
29 : : #include "gstrfuncs.h"
30 : : #include "gtestutils.h"
31 : : #include "gtypes.h"
32 : : #include "glibintl.h"
33 : :
34 : :
35 : : /**
36 : : * GChecksum:
37 : : *
38 : : * GLib provides a generic API for computing checksums (or ‘digests’)
39 : : * for a sequence of arbitrary bytes, using various hashing algorithms
40 : : * like MD5, SHA-1 and SHA-256. Checksums are commonly used in various
41 : : * environments and specifications.
42 : : *
43 : : * To create a new `GChecksum`, use [ctor@GLib.Checksum.new]. To free
44 : : * a `GChecksum`, use [method@GLib.Checksum.free].
45 : : *
46 : : * GLib supports incremental checksums using the `GChecksum` data
47 : : * structure, by calling [method@GLib.Checksum.update] as long as there’s data
48 : : * available and then using [method@GLib.Checksum.get_string] or
49 : : * [method@GLib.Checksum.get_digest] to compute the checksum and return it
50 : : * either as a string in hexadecimal form, or as a raw sequence of bytes. To
51 : : * compute the checksum for binary blobs and nul-terminated strings in
52 : : * one go, use the convenience functions [func@GLib.compute_checksum_for_data]
53 : : * and [func@GLib.compute_checksum_for_string], respectively.
54 : : *
55 : : * Since: 2.16
56 : : **/
57 : :
58 : : #define IS_VALID_TYPE(type) ((type) >= G_CHECKSUM_MD5 && (type) <= G_CHECKSUM_SHA384)
59 : :
60 : : /* The fact that these are lower case characters is part of the ABI */
61 : : static const gchar hex_digits[] = "0123456789abcdef";
62 : :
63 : : #define MD5_DATASIZE 64
64 : : #define MD5_DIGEST_LEN 16
65 : :
66 : : typedef struct
67 : : {
68 : : guint32 buf[4];
69 : : guint32 bits[2];
70 : :
71 : : union {
72 : : guchar data[MD5_DATASIZE];
73 : : guint32 data32[MD5_DATASIZE / 4];
74 : : } u;
75 : :
76 : : guchar digest[MD5_DIGEST_LEN];
77 : : } Md5sum;
78 : :
79 : : #define SHA1_DATASIZE 64
80 : : #define SHA1_DIGEST_LEN 20
81 : :
82 : : typedef struct
83 : : {
84 : : guint32 buf[5];
85 : : guint32 bits[2];
86 : :
87 : : /* we pack 64 unsigned chars into 16 32-bit unsigned integers */
88 : : guint32 data[16];
89 : :
90 : : guchar digest[SHA1_DIGEST_LEN];
91 : : } Sha1sum;
92 : :
93 : : #define SHA256_DATASIZE 64
94 : : #define SHA256_DIGEST_LEN 32
95 : :
96 : : typedef struct
97 : : {
98 : : guint32 buf[8];
99 : : guint32 bits[2];
100 : :
101 : : guint8 data[SHA256_DATASIZE];
102 : :
103 : : guchar digest[SHA256_DIGEST_LEN];
104 : : } Sha256sum;
105 : :
106 : : /* SHA2 is common thing for SHA-384, SHA-512, SHA-512/224 and SHA-512/256 */
107 : : #define SHA2_BLOCK_LEN 128 /* 1024 bits message block */
108 : : #define SHA384_DIGEST_LEN 48
109 : : #define SHA512_DIGEST_LEN 64
110 : :
111 : : typedef struct
112 : : {
113 : : guint64 H[8];
114 : :
115 : : guint8 block[SHA2_BLOCK_LEN];
116 : : guint8 block_len;
117 : :
118 : : guint64 data_len[2];
119 : :
120 : : guchar digest[SHA512_DIGEST_LEN];
121 : : } Sha512sum;
122 : :
123 : : struct _GChecksum
124 : : {
125 : : GChecksumType type;
126 : :
127 : : gchar *digest_str;
128 : :
129 : : union {
130 : : Md5sum md5;
131 : : Sha1sum sha1;
132 : : Sha256sum sha256;
133 : : Sha512sum sha512;
134 : : } sum;
135 : : };
136 : :
137 : : /* we need different byte swapping functions because MD5 expects buffers
138 : : * to be little-endian, while SHA1 and SHA256 expect them in big-endian
139 : : * form.
140 : : */
141 : :
142 : : #if G_BYTE_ORDER == G_LITTLE_ENDIAN
143 : : #define md5_byte_reverse(buffer,length)
144 : : #else
145 : : /* assume that the passed buffer is integer aligned */
146 : : static inline void
147 : : md5_byte_reverse (guchar *buffer,
148 : : gulong length)
149 : : {
150 : : guint32 bit;
151 : :
152 : : do
153 : : {
154 : : bit = (guint32) ((unsigned) buffer[3] << 8 | buffer[2]) << 16 |
155 : : ((unsigned) buffer[1] << 8 | buffer[0]);
156 : : * (guint32 *) buffer = bit;
157 : : buffer += 4;
158 : : }
159 : : while (--length);
160 : : }
161 : : #endif /* G_BYTE_ORDER == G_LITTLE_ENDIAN */
162 : :
163 : : #if G_BYTE_ORDER == G_BIG_ENDIAN
164 : : #define sha_byte_reverse(buffer,length)
165 : : #else
166 : : static inline void
167 : 152408 : sha_byte_reverse (guint32 *buffer,
168 : : gint length)
169 : : {
170 : 152408 : length /= sizeof (guint32);
171 [ + + ]: 1935307 : while (length--)
172 : : {
173 : 1782899 : *buffer = GUINT32_SWAP_LE_BE (*buffer);
174 : 1782899 : ++buffer;
175 : : }
176 : 152408 : }
177 : : #endif /* G_BYTE_ORDER == G_BIG_ENDIAN */
178 : :
179 : : static gchar *
180 : 252398 : digest_to_string (guint8 *digest,
181 : : gsize digest_len)
182 : : {
183 : 252398 : gsize i, len = digest_len * 2;
184 : : gchar *retval;
185 : :
186 : 252398 : retval = g_new (gchar, len + 1);
187 : :
188 [ + + ]: 9326242 : for (i = 0; i < digest_len; i++)
189 : : {
190 : 9073844 : guint8 byte = digest[i];
191 : :
192 : 9073844 : retval[2 * i] = hex_digits[byte >> 4];
193 : 9073844 : retval[2 * i + 1] = hex_digits[byte & 0xf];
194 : : }
195 : :
196 : 252398 : retval[len] = 0;
197 : :
198 : 252398 : return retval;
199 : : }
200 : :
201 : : /*
202 : : * MD5 Checksum
203 : : */
204 : :
205 : : /* This MD5 digest computation is based on the equivalent code
206 : : * written by Colin Plumb. It came with this notice:
207 : : *
208 : : * This code implements the MD5 message-digest algorithm.
209 : : * The algorithm is due to Ron Rivest. This code was
210 : : * written by Colin Plumb in 1993, no copyright is claimed.
211 : : * This code is in the public domain; do with it what you wish.
212 : : *
213 : : * Equivalent code is available from RSA Data Security, Inc.
214 : : * This code has been tested against that, and is equivalent,
215 : : * except that you don't need to include two pages of legalese
216 : : * with every copy.
217 : : */
218 : :
219 : : static void
220 : 34413 : md5_sum_init (Md5sum *md5)
221 : : {
222 : : /* arbitrary constants */
223 : 34413 : md5->buf[0] = 0x67452301;
224 : 34413 : md5->buf[1] = 0xefcdab89;
225 : 34413 : md5->buf[2] = 0x98badcfe;
226 : 34413 : md5->buf[3] = 0x10325476;
227 : :
228 : 34413 : md5->bits[0] = md5->bits[1] = 0;
229 : 34413 : }
230 : :
231 : : /*
232 : : * The core of the MD5 algorithm, this alters an existing MD5 hash to
233 : : * reflect the addition of 16 longwords of new data. md5_sum_update()
234 : : * blocks the data and converts bytes into longwords for this routine.
235 : : */
236 : : static void
237 : 102866 : md5_transform (guint32 buf[4],
238 : : guint32 const in[16])
239 : : {
240 : : guint32 a, b, c, d;
241 : :
242 : : /* The four core functions - F1 is optimized somewhat */
243 : : #define F1(x, y, z) (z ^ (x & (y ^ z)))
244 : : #define F2(x, y, z) F1 (z, x, y)
245 : : #define F3(x, y, z) (x ^ y ^ z)
246 : : #define F4(x, y, z) (y ^ (x | ~z))
247 : :
248 : : /* This is the central step in the MD5 algorithm. */
249 : : #define md5_step(f, w, x, y, z, data, s) \
250 : : ( w += f (x, y, z) + data, w = w << s | w >> (32 - s), w += x )
251 : :
252 : 102866 : a = buf[0];
253 : 102866 : b = buf[1];
254 : 102866 : c = buf[2];
255 : 102866 : d = buf[3];
256 : :
257 : 102866 : md5_step (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
258 : 102866 : md5_step (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
259 : 102866 : md5_step (F1, c, d, a, b, in[2] + 0x242070db, 17);
260 : 102866 : md5_step (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
261 : 102866 : md5_step (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
262 : 102866 : md5_step (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
263 : 102866 : md5_step (F1, c, d, a, b, in[6] + 0xa8304613, 17);
264 : 102866 : md5_step (F1, b, c, d, a, in[7] + 0xfd469501, 22);
265 : 102866 : md5_step (F1, a, b, c, d, in[8] + 0x698098d8, 7);
266 : 102866 : md5_step (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
267 : 102866 : md5_step (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
268 : 102866 : md5_step (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
269 : 102866 : md5_step (F1, a, b, c, d, in[12] + 0x6b901122, 7);
270 : 102866 : md5_step (F1, d, a, b, c, in[13] + 0xfd987193, 12);
271 : 102866 : md5_step (F1, c, d, a, b, in[14] + 0xa679438e, 17);
272 : 102866 : md5_step (F1, b, c, d, a, in[15] + 0x49b40821, 22);
273 : :
274 : 102866 : md5_step (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
275 : 102866 : md5_step (F2, d, a, b, c, in[6] + 0xc040b340, 9);
276 : 102866 : md5_step (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
277 : 102866 : md5_step (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
278 : 102866 : md5_step (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
279 : 102866 : md5_step (F2, d, a, b, c, in[10] + 0x02441453, 9);
280 : 102866 : md5_step (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
281 : 102866 : md5_step (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
282 : 102866 : md5_step (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
283 : 102866 : md5_step (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
284 : 102866 : md5_step (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
285 : 102866 : md5_step (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
286 : 102866 : md5_step (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
287 : 102866 : md5_step (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
288 : 102866 : md5_step (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
289 : 102866 : md5_step (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
290 : :
291 : 102866 : md5_step (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
292 : 102866 : md5_step (F3, d, a, b, c, in[8] + 0x8771f681, 11);
293 : 102866 : md5_step (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
294 : 102866 : md5_step (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
295 : 102866 : md5_step (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
296 : 102866 : md5_step (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
297 : 102866 : md5_step (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
298 : 102866 : md5_step (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
299 : 102866 : md5_step (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
300 : 102866 : md5_step (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
301 : 102866 : md5_step (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
302 : 102866 : md5_step (F3, b, c, d, a, in[6] + 0x04881d05, 23);
303 : 102866 : md5_step (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
304 : 102866 : md5_step (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
305 : 102866 : md5_step (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
306 : 102866 : md5_step (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
307 : :
308 : 102866 : md5_step (F4, a, b, c, d, in[0] + 0xf4292244, 6);
309 : 102866 : md5_step (F4, d, a, b, c, in[7] + 0x432aff97, 10);
310 : 102866 : md5_step (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
311 : 102866 : md5_step (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
312 : 102866 : md5_step (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
313 : 102866 : md5_step (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
314 : 102866 : md5_step (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
315 : 102866 : md5_step (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
316 : 102866 : md5_step (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
317 : 102866 : md5_step (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
318 : 102866 : md5_step (F4, c, d, a, b, in[6] + 0xa3014314, 15);
319 : 102866 : md5_step (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
320 : 102866 : md5_step (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
321 : 102866 : md5_step (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
322 : 102866 : md5_step (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
323 : 102866 : md5_step (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
324 : :
325 : 102866 : buf[0] += a;
326 : 102866 : buf[1] += b;
327 : 102866 : buf[2] += c;
328 : 102866 : buf[3] += d;
329 : :
330 : : #undef F1
331 : : #undef F2
332 : : #undef F3
333 : : #undef F4
334 : : #undef md5_step
335 : 102866 : }
336 : :
337 : : static void
338 : 197223 : md5_sum_update (Md5sum *md5,
339 : : const guchar *data,
340 : : gsize length)
341 : : {
342 : : guint32 bit;
343 : :
344 : 197223 : bit = md5->bits[0];
345 : 197223 : md5->bits[0] = bit + ((guint32) length << 3);
346 : :
347 : : /* carry from low to high */
348 [ - + ]: 197223 : if (md5->bits[0] < bit)
349 : 0 : md5->bits[1] += 1;
350 : :
351 : 197223 : md5->bits[1] += length >> 29;
352 : :
353 : : /* bytes already in Md5sum->u.data */
354 : 197223 : bit = (bit >> 3) & 0x3f;
355 : :
356 : : /* handle any leading odd-sized chunks */
357 [ + + ]: 197223 : if (bit)
358 : : {
359 : 160434 : guchar *p = md5->u.data + bit;
360 : :
361 : 160434 : bit = MD5_DATASIZE - bit;
362 [ + + ]: 160434 : if (length < bit)
363 : : {
364 : 131202 : memcpy (p, data, length);
365 : 131202 : return;
366 : : }
367 : :
368 : 29232 : memcpy (p, data, bit);
369 : :
370 : : md5_byte_reverse (md5->u.data, 16);
371 : 29232 : md5_transform (md5->buf, md5->u.data32);
372 : :
373 : 29232 : data += bit;
374 : 29232 : length -= bit;
375 : : }
376 : :
377 : : /* process data in 64-byte chunks */
378 [ + + ]: 84184 : while (length >= MD5_DATASIZE)
379 : : {
380 : 18163 : memcpy (md5->u.data, data, MD5_DATASIZE);
381 : :
382 : : md5_byte_reverse (md5->u.data, 16);
383 : 18163 : md5_transform (md5->buf, md5->u.data32);
384 : :
385 : 18163 : data += MD5_DATASIZE;
386 : 18163 : length -= MD5_DATASIZE;
387 : : }
388 : :
389 : : /* handle any remaining bytes of data */
390 : 66021 : memcpy (md5->u.data, data, length);
391 : : }
392 : :
393 : : /* closes a checksum */
394 : : static void
395 : 50882 : md5_sum_close (Md5sum *md5)
396 : : {
397 : : guint count;
398 : : guchar *p;
399 : :
400 : : /* Compute number of bytes mod 64 */
401 : 50882 : count = (md5->bits[0] >> 3) & 0x3F;
402 : :
403 : : /* Set the first char of padding to 0x80.
404 : : * This is safe since there is always at least one byte free
405 : : */
406 : 50882 : p = md5->u.data + count;
407 : 50882 : *p++ = 0x80;
408 : :
409 : : /* Bytes of padding needed to make 64 bytes */
410 : 50882 : count = MD5_DATASIZE - 1 - count;
411 : :
412 : : /* Pad out to 56 mod 64 */
413 [ + + ]: 50882 : if (count < 8)
414 : : {
415 : : /* Two lots of padding: Pad the first block to 64 bytes */
416 : 4589 : memset (p, 0, count);
417 : :
418 : : md5_byte_reverse (md5->u.data, 16);
419 : 4589 : md5_transform (md5->buf, md5->u.data32);
420 : :
421 : : /* Now fill the next block with 56 bytes */
422 : 4589 : memset (md5->u.data, 0, MD5_DATASIZE - 8);
423 : : }
424 : : else
425 : : {
426 : : /* Pad block to 56 bytes */
427 : 46293 : memset (p, 0, count - 8);
428 : : }
429 : :
430 : : md5_byte_reverse (md5->u.data, 14);
431 : :
432 : : /* Append length in bits and transform */
433 : 50882 : md5->u.data32[14] = md5->bits[0];
434 : 50882 : md5->u.data32[15] = md5->bits[1];
435 : :
436 : 50882 : md5_transform (md5->buf, md5->u.data32);
437 : : md5_byte_reverse ((guchar *) md5->buf, 4);
438 : :
439 : 50882 : memcpy (md5->digest, md5->buf, 16);
440 : :
441 : : /* Reset buffers in case they contain sensitive data */
442 : 50882 : memset (md5->buf, 0, sizeof (md5->buf));
443 : 50882 : memset (md5->u.data, 0, sizeof (md5->u.data));
444 : 50882 : }
445 : :
446 : : static gchar *
447 : 50882 : md5_sum_to_string (Md5sum *md5)
448 : : {
449 : 50882 : return digest_to_string (md5->digest, MD5_DIGEST_LEN);
450 : : }
451 : :
452 : : static void
453 : 16669 : md5_sum_digest (Md5sum *md5,
454 : : guint8 *digest)
455 : : {
456 : : gint i;
457 : :
458 [ + + ]: 283373 : for (i = 0; i < MD5_DIGEST_LEN; i++)
459 : 266704 : digest[i] = md5->digest[i];
460 : 16669 : }
461 : :
462 : : /*
463 : : * SHA-1 Checksum
464 : : */
465 : :
466 : : /* The following implementation comes from D-Bus dbus-sha.c. I've changed
467 : : * it to use GLib types and to work more like the MD5 implementation above.
468 : : * I left the comments to have a history of this code.
469 : : * -- Emmanuele Bassi, ebassi@gnome.org
470 : : */
471 : :
472 : : /* The following comments have the history of where this code
473 : : * comes from. I actually copied it from GNet in GNOME CVS.
474 : : * - hp@redhat.com
475 : : */
476 : :
477 : : /*
478 : : * sha.h : Implementation of the Secure Hash Algorithm
479 : : *
480 : : * Part of the Python Cryptography Toolkit, version 1.0.0
481 : : *
482 : : * Copyright (C) 1995, A.M. Kuchling
483 : : *
484 : : * Distribute and use freely; there are no restrictions on further
485 : : * dissemination and usage except those imposed by the laws of your
486 : : * country of residence.
487 : : *
488 : : */
489 : :
490 : : /* SHA: NIST's Secure Hash Algorithm */
491 : :
492 : : /* Based on SHA code originally posted to sci.crypt by Peter Gutmann
493 : : in message <30ajo5$oe8@ccu2.auckland.ac.nz>.
494 : : Modified to test for endianness on creation of SHA objects by AMK.
495 : : Also, the original specification of SHA was found to have a weakness
496 : : by NSA/NIST. This code implements the fixed version of SHA.
497 : : */
498 : :
499 : : /* Here's the first paragraph of Peter Gutmann's posting:
500 : :
501 : : The following is my SHA (FIPS 180) code updated to allow use of the "fixed"
502 : : SHA, thanks to Jim Gillogly and an anonymous contributor for the information on
503 : : what's changed in the new version. The fix is a simple change which involves
504 : : adding a single rotate in the initial expansion function. It is unknown
505 : : whether this is an optimal solution to the problem which was discovered in the
506 : : SHA or whether it's simply a bandaid which fixes the problem with a minimum of
507 : : effort (for example the reengineering of a great many Capstone chips).
508 : : */
509 : :
510 : : static void
511 : 33966 : sha1_sum_init (Sha1sum *sha1)
512 : : {
513 : : /* initialize constants */
514 : 33966 : sha1->buf[0] = 0x67452301L;
515 : 33966 : sha1->buf[1] = 0xEFCDAB89L;
516 : 33966 : sha1->buf[2] = 0x98BADCFEL;
517 : 33966 : sha1->buf[3] = 0x10325476L;
518 : 33966 : sha1->buf[4] = 0xC3D2E1F0L;
519 : :
520 : : /* initialize bits */
521 : 33966 : sha1->bits[0] = sha1->bits[1] = 0;
522 : 33966 : }
523 : :
524 : : /* The SHA f()-functions. */
525 : :
526 : : #define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */
527 : : #define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */
528 : : #define f3(x,y,z) (( x & y) | (z & (x | y))) /* Rounds 40-59 */
529 : : #define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */
530 : :
531 : : /* The SHA Mysterious Constants */
532 : : #define K1 0x5A827999L /* Rounds 0-19 */
533 : : #define K2 0x6ED9EBA1L /* Rounds 20-39 */
534 : : #define K3 0x8F1BBCDCL /* Rounds 40-59 */
535 : : #define K4 0xCA62C1D6L /* Rounds 60-79 */
536 : :
537 : : /* 32-bit rotate left - kludged with shifts */
538 : : #define ROTL(n,X) (((X) << n ) | ((X) >> (32 - n)))
539 : :
540 : : /* The initial expanding function. The hash function is defined over an
541 : : 80-word expanded input array W, where the first 16 are copies of the input
542 : : data, and the remaining 64 are defined by
543 : :
544 : : W[ i ] = W[ i - 16 ] ^ W[ i - 14 ] ^ W[ i - 8 ] ^ W[ i - 3 ]
545 : :
546 : : This implementation generates these values on the fly in a circular
547 : : buffer - thanks to Colin Plumb, colin@nyx10.cs.du.edu for this
548 : : optimization.
549 : :
550 : : The updated SHA changes the expanding function by adding a rotate of 1
551 : : bit. Thanks to Jim Gillogly, jim@rand.org, and an anonymous contributor
552 : : for this information */
553 : :
554 : : #define expand(W,i) (W[ i & 15 ] = ROTL (1, (W[ i & 15] ^ \
555 : : W[(i - 14) & 15] ^ \
556 : : W[(i - 8) & 15] ^ \
557 : : W[(i - 3) & 15])))
558 : :
559 : :
560 : : /* The prototype SHA sub-round. The fundamental sub-round is:
561 : :
562 : : a' = e + ROTL( 5, a ) + f( b, c, d ) + k + data;
563 : : b' = a;
564 : : c' = ROTL( 30, b );
565 : : d' = c;
566 : : e' = d;
567 : :
568 : : but this is implemented by unrolling the loop 5 times and renaming the
569 : : variables ( e, a, b, c, d ) = ( a', b', c', d', e' ) each iteration.
570 : : This code is then replicated 20 times for each of the 4 functions, using
571 : : the next 20 values from the W[] array each time */
572 : :
573 : : #define subRound(a, b, c, d, e, f, k, data) \
574 : : (e += ROTL (5, a) + f(b, c, d) + k + data, b = ROTL (30, b))
575 : :
576 : : static void
577 : 101975 : sha1_transform (guint32 buf[5],
578 : : guint32 in[16])
579 : : {
580 : : guint32 A, B, C, D, E;
581 : :
582 : 101975 : A = buf[0];
583 : 101975 : B = buf[1];
584 : 101975 : C = buf[2];
585 : 101975 : D = buf[3];
586 : 101975 : E = buf[4];
587 : :
588 : : /* Heavy mangling, in 4 sub-rounds of 20 iterations each. */
589 : 101975 : subRound (A, B, C, D, E, f1, K1, in[0]);
590 : 101975 : subRound (E, A, B, C, D, f1, K1, in[1]);
591 : 101975 : subRound (D, E, A, B, C, f1, K1, in[2]);
592 : 101975 : subRound (C, D, E, A, B, f1, K1, in[3]);
593 : 101975 : subRound (B, C, D, E, A, f1, K1, in[4]);
594 : 101975 : subRound (A, B, C, D, E, f1, K1, in[5]);
595 : 101975 : subRound (E, A, B, C, D, f1, K1, in[6]);
596 : 101975 : subRound (D, E, A, B, C, f1, K1, in[7]);
597 : 101975 : subRound (C, D, E, A, B, f1, K1, in[8]);
598 : 101975 : subRound (B, C, D, E, A, f1, K1, in[9]);
599 : 101975 : subRound (A, B, C, D, E, f1, K1, in[10]);
600 : 101975 : subRound (E, A, B, C, D, f1, K1, in[11]);
601 : 101975 : subRound (D, E, A, B, C, f1, K1, in[12]);
602 : 101975 : subRound (C, D, E, A, B, f1, K1, in[13]);
603 : 101975 : subRound (B, C, D, E, A, f1, K1, in[14]);
604 : 101975 : subRound (A, B, C, D, E, f1, K1, in[15]);
605 : 101975 : subRound (E, A, B, C, D, f1, K1, expand (in, 16));
606 : 101975 : subRound (D, E, A, B, C, f1, K1, expand (in, 17));
607 : 101975 : subRound (C, D, E, A, B, f1, K1, expand (in, 18));
608 : 101975 : subRound (B, C, D, E, A, f1, K1, expand (in, 19));
609 : :
610 : 101975 : subRound (A, B, C, D, E, f2, K2, expand (in, 20));
611 : 101975 : subRound (E, A, B, C, D, f2, K2, expand (in, 21));
612 : 101975 : subRound (D, E, A, B, C, f2, K2, expand (in, 22));
613 : 101975 : subRound (C, D, E, A, B, f2, K2, expand (in, 23));
614 : 101975 : subRound (B, C, D, E, A, f2, K2, expand (in, 24));
615 : 101975 : subRound (A, B, C, D, E, f2, K2, expand (in, 25));
616 : 101975 : subRound (E, A, B, C, D, f2, K2, expand (in, 26));
617 : 101975 : subRound (D, E, A, B, C, f2, K2, expand (in, 27));
618 : 101975 : subRound (C, D, E, A, B, f2, K2, expand (in, 28));
619 : 101975 : subRound (B, C, D, E, A, f2, K2, expand (in, 29));
620 : 101975 : subRound (A, B, C, D, E, f2, K2, expand (in, 30));
621 : 101975 : subRound (E, A, B, C, D, f2, K2, expand (in, 31));
622 : 101975 : subRound (D, E, A, B, C, f2, K2, expand (in, 32));
623 : 101975 : subRound (C, D, E, A, B, f2, K2, expand (in, 33));
624 : 101975 : subRound (B, C, D, E, A, f2, K2, expand (in, 34));
625 : 101975 : subRound (A, B, C, D, E, f2, K2, expand (in, 35));
626 : 101975 : subRound (E, A, B, C, D, f2, K2, expand (in, 36));
627 : 101975 : subRound (D, E, A, B, C, f2, K2, expand (in, 37));
628 : 101975 : subRound (C, D, E, A, B, f2, K2, expand (in, 38));
629 : 101975 : subRound (B, C, D, E, A, f2, K2, expand (in, 39));
630 : :
631 : 101975 : subRound (A, B, C, D, E, f3, K3, expand (in, 40));
632 : 101975 : subRound (E, A, B, C, D, f3, K3, expand (in, 41));
633 : 101975 : subRound (D, E, A, B, C, f3, K3, expand (in, 42));
634 : 101975 : subRound (C, D, E, A, B, f3, K3, expand (in, 43));
635 : 101975 : subRound (B, C, D, E, A, f3, K3, expand (in, 44));
636 : 101975 : subRound (A, B, C, D, E, f3, K3, expand (in, 45));
637 : 101975 : subRound (E, A, B, C, D, f3, K3, expand (in, 46));
638 : 101975 : subRound (D, E, A, B, C, f3, K3, expand (in, 47));
639 : 101975 : subRound (C, D, E, A, B, f3, K3, expand (in, 48));
640 : 101975 : subRound (B, C, D, E, A, f3, K3, expand (in, 49));
641 : 101975 : subRound (A, B, C, D, E, f3, K3, expand (in, 50));
642 : 101975 : subRound (E, A, B, C, D, f3, K3, expand (in, 51));
643 : 101975 : subRound (D, E, A, B, C, f3, K3, expand (in, 52));
644 : 101975 : subRound (C, D, E, A, B, f3, K3, expand (in, 53));
645 : 101975 : subRound (B, C, D, E, A, f3, K3, expand (in, 54));
646 : 101975 : subRound (A, B, C, D, E, f3, K3, expand (in, 55));
647 : 101975 : subRound (E, A, B, C, D, f3, K3, expand (in, 56));
648 : 101975 : subRound (D, E, A, B, C, f3, K3, expand (in, 57));
649 : 101975 : subRound (C, D, E, A, B, f3, K3, expand (in, 58));
650 : 101975 : subRound (B, C, D, E, A, f3, K3, expand (in, 59));
651 : :
652 : 101975 : subRound (A, B, C, D, E, f4, K4, expand (in, 60));
653 : 101975 : subRound (E, A, B, C, D, f4, K4, expand (in, 61));
654 : 101975 : subRound (D, E, A, B, C, f4, K4, expand (in, 62));
655 : 101975 : subRound (C, D, E, A, B, f4, K4, expand (in, 63));
656 : 101975 : subRound (B, C, D, E, A, f4, K4, expand (in, 64));
657 : 101975 : subRound (A, B, C, D, E, f4, K4, expand (in, 65));
658 : 101975 : subRound (E, A, B, C, D, f4, K4, expand (in, 66));
659 : 101975 : subRound (D, E, A, B, C, f4, K4, expand (in, 67));
660 : 101975 : subRound (C, D, E, A, B, f4, K4, expand (in, 68));
661 : 101975 : subRound (B, C, D, E, A, f4, K4, expand (in, 69));
662 : 101975 : subRound (A, B, C, D, E, f4, K4, expand (in, 70));
663 : 101975 : subRound (E, A, B, C, D, f4, K4, expand (in, 71));
664 : 101975 : subRound (D, E, A, B, C, f4, K4, expand (in, 72));
665 : 101975 : subRound (C, D, E, A, B, f4, K4, expand (in, 73));
666 : 101975 : subRound (B, C, D, E, A, f4, K4, expand (in, 74));
667 : 101975 : subRound (A, B, C, D, E, f4, K4, expand (in, 75));
668 : 101975 : subRound (E, A, B, C, D, f4, K4, expand (in, 76));
669 : 101975 : subRound (D, E, A, B, C, f4, K4, expand (in, 77));
670 : 101975 : subRound (C, D, E, A, B, f4, K4, expand (in, 78));
671 : 101975 : subRound (B, C, D, E, A, f4, K4, expand (in, 79));
672 : :
673 : : /* Build message digest */
674 : 101975 : buf[0] += A;
675 : 101975 : buf[1] += B;
676 : 101975 : buf[2] += C;
677 : 101975 : buf[3] += D;
678 : 101975 : buf[4] += E;
679 : 101975 : }
680 : :
681 : : #undef K1
682 : : #undef K2
683 : : #undef K3
684 : : #undef K4
685 : : #undef f1
686 : : #undef f2
687 : : #undef f3
688 : : #undef f4
689 : : #undef ROTL
690 : : #undef expand
691 : : #undef subRound
692 : :
693 : : static void
694 : 196788 : sha1_sum_update (Sha1sum *sha1,
695 : : const guchar *buffer,
696 : : gsize count)
697 : : {
698 : : guint32 tmp;
699 : : guint dataCount;
700 : :
701 : : /* Update bitcount */
702 : 196788 : tmp = sha1->bits[0];
703 [ - + ]: 196788 : if ((sha1->bits[0] = tmp + ((guint32) count << 3) ) < tmp)
704 : 0 : sha1->bits[1] += 1; /* Carry from low to high */
705 : 196788 : sha1->bits[1] += count >> 29;
706 : :
707 : : /* Get count of bytes already in data */
708 : 196788 : dataCount = (guint) (tmp >> 3) & 0x3F;
709 : :
710 : : /* Handle any leading odd-sized chunks */
711 [ + + ]: 196788 : if (dataCount)
712 : : {
713 : 160434 : guchar *p = (guchar *) sha1->data + dataCount;
714 : :
715 : 160434 : dataCount = SHA1_DATASIZE - dataCount;
716 [ + + ]: 160434 : if (count < dataCount)
717 : : {
718 : 131202 : memcpy (p, buffer, count);
719 : 131202 : return;
720 : : }
721 : :
722 : 29232 : memcpy (p, buffer, dataCount);
723 : :
724 : 29232 : sha_byte_reverse (sha1->data, SHA1_DATASIZE);
725 : 29232 : sha1_transform (sha1->buf, sha1->data);
726 : :
727 : 29232 : buffer += dataCount;
728 : 29232 : count -= dataCount;
729 : : }
730 : :
731 : : /* Process data in SHA1_DATASIZE chunks */
732 [ + + ]: 83520 : while (count >= SHA1_DATASIZE)
733 : : {
734 : 17934 : memcpy (sha1->data, buffer, SHA1_DATASIZE);
735 : :
736 : 17934 : sha_byte_reverse (sha1->data, SHA1_DATASIZE);
737 : 17934 : sha1_transform (sha1->buf, sha1->data);
738 : :
739 : 17934 : buffer += SHA1_DATASIZE;
740 : 17934 : count -= SHA1_DATASIZE;
741 : : }
742 : :
743 : : /* Handle any remaining bytes of data. */
744 : 65586 : memcpy (sha1->data, buffer, count);
745 : : }
746 : :
747 : : /* Final wrapup - pad to SHA_DATASIZE-byte boundary with the bit pattern
748 : : 1 0* (64-bit count of bits processed, MSB-first) */
749 : : static void
750 : 50433 : sha1_sum_close (Sha1sum *sha1)
751 : : {
752 : : gint count;
753 : : guchar *data_p;
754 : :
755 : : /* Compute number of bytes mod 64 */
756 : 50433 : count = (gint) ((sha1->bits[0] >> 3) & 0x3f);
757 : :
758 : : /* Set the first char of padding to 0x80. This is safe since there is
759 : : always at least one byte free */
760 : 50433 : data_p = (guchar *) sha1->data + count;
761 : 50433 : *data_p++ = 0x80;
762 : :
763 : : /* Bytes of padding needed to make 64 bytes */
764 : 50433 : count = SHA1_DATASIZE - 1 - count;
765 : :
766 : : /* Pad out to 56 mod 64 */
767 [ + + ]: 50433 : if (count < 8)
768 : : {
769 : : /* Two lots of padding: Pad the first block to 64 bytes */
770 : 4376 : memset (data_p, 0, count);
771 : :
772 : 4376 : sha_byte_reverse (sha1->data, SHA1_DATASIZE);
773 : 4376 : sha1_transform (sha1->buf, sha1->data);
774 : :
775 : : /* Now fill the next block with 56 bytes */
776 : 4376 : memset (sha1->data, 0, SHA1_DATASIZE - 8);
777 : : }
778 : : else
779 : : {
780 : : /* Pad block to 56 bytes */
781 : 46057 : memset (data_p, 0, count - 8);
782 : : }
783 : :
784 : : /* Append length in bits and transform */
785 : 50433 : sha1->data[14] = sha1->bits[1];
786 : 50433 : sha1->data[15] = sha1->bits[0];
787 : :
788 : 50433 : sha_byte_reverse (sha1->data, SHA1_DATASIZE - 8);
789 : 50433 : sha1_transform (sha1->buf, sha1->data);
790 : 50433 : sha_byte_reverse (sha1->buf, SHA1_DIGEST_LEN);
791 : :
792 : 50433 : memcpy (sha1->digest, sha1->buf, SHA1_DIGEST_LEN);
793 : :
794 : : /* Reset buffers in case they contain sensitive data */
795 : 50433 : memset (sha1->buf, 0, sizeof (sha1->buf));
796 : 50433 : memset (sha1->data, 0, sizeof (sha1->data));
797 : 50433 : }
798 : :
799 : : static gchar *
800 : 50433 : sha1_sum_to_string (Sha1sum *sha1)
801 : : {
802 : 50433 : return digest_to_string (sha1->digest, SHA1_DIGEST_LEN);
803 : : }
804 : :
805 : : static void
806 : 16681 : sha1_sum_digest (Sha1sum *sha1,
807 : : guint8 *digest)
808 : : {
809 : : gint i;
810 : :
811 [ + + ]: 350301 : for (i = 0; i < SHA1_DIGEST_LEN; i++)
812 : 333620 : digest[i] = sha1->digest[i];
813 : 16681 : }
814 : :
815 : : /*
816 : : * SHA-256 Checksum
817 : : */
818 : :
819 : : /* adapted from the SHA256 implementation in gsk/src/hash/gskhash.c.
820 : : *
821 : : * Copyright (C) 2006 Dave Benson
822 : : * Released under the terms of the GNU Lesser General Public License
823 : : */
824 : :
825 : : static void
826 : 33931 : sha256_sum_init (Sha256sum *sha256)
827 : : {
828 : 33931 : sha256->buf[0] = 0x6a09e667;
829 : 33931 : sha256->buf[1] = 0xbb67ae85;
830 : 33931 : sha256->buf[2] = 0x3c6ef372;
831 : 33931 : sha256->buf[3] = 0xa54ff53a;
832 : 33931 : sha256->buf[4] = 0x510e527f;
833 : 33931 : sha256->buf[5] = 0x9b05688c;
834 : 33931 : sha256->buf[6] = 0x1f83d9ab;
835 : 33931 : sha256->buf[7] = 0x5be0cd19;
836 : :
837 : 33931 : sha256->bits[0] = sha256->bits[1] = 0;
838 : 33931 : }
839 : :
840 : : #define GET_UINT32(n,b,i) G_STMT_START{ \
841 : : (n) = ((guint32) (b)[(i) ] << 24) \
842 : : | ((guint32) (b)[(i) + 1] << 16) \
843 : : | ((guint32) (b)[(i) + 2] << 8) \
844 : : | ((guint32) (b)[(i) + 3] ); } G_STMT_END
845 : :
846 : : #define PUT_UINT32(n,b,i) G_STMT_START{ \
847 : : (b)[(i) ] = (guint8) ((n) >> 24); \
848 : : (b)[(i) + 1] = (guint8) ((n) >> 16); \
849 : : (b)[(i) + 2] = (guint8) ((n) >> 8); \
850 : : (b)[(i) + 3] = (guint8) ((n) ); } G_STMT_END
851 : :
852 : : static void
853 : 101859 : sha256_transform (guint32 buf[8],
854 : : guint8 const data[64])
855 : : {
856 : : guint32 temp1, temp2, W[64];
857 : : guint32 A, B, C, D, E, F, G, H;
858 : :
859 : 101859 : GET_UINT32 (W[0], data, 0);
860 : 101859 : GET_UINT32 (W[1], data, 4);
861 : 101859 : GET_UINT32 (W[2], data, 8);
862 : 101859 : GET_UINT32 (W[3], data, 12);
863 : 101859 : GET_UINT32 (W[4], data, 16);
864 : 101859 : GET_UINT32 (W[5], data, 20);
865 : 101859 : GET_UINT32 (W[6], data, 24);
866 : 101859 : GET_UINT32 (W[7], data, 28);
867 : 101859 : GET_UINT32 (W[8], data, 32);
868 : 101859 : GET_UINT32 (W[9], data, 36);
869 : 101859 : GET_UINT32 (W[10], data, 40);
870 : 101859 : GET_UINT32 (W[11], data, 44);
871 : 101859 : GET_UINT32 (W[12], data, 48);
872 : 101859 : GET_UINT32 (W[13], data, 52);
873 : 101859 : GET_UINT32 (W[14], data, 56);
874 : 101859 : GET_UINT32 (W[15], data, 60);
875 : :
876 : : #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
877 : : #define ROTR(x,n) (SHR (x,n) | (x << (32 - n)))
878 : :
879 : : #define S0(x) (ROTR (x, 7) ^ ROTR (x,18) ^ SHR (x, 3))
880 : : #define S1(x) (ROTR (x,17) ^ ROTR (x,19) ^ SHR (x,10))
881 : : #define S2(x) (ROTR (x, 2) ^ ROTR (x,13) ^ ROTR (x,22))
882 : : #define S3(x) (ROTR (x, 6) ^ ROTR (x,11) ^ ROTR (x,25))
883 : :
884 : : #define F0(x,y,z) ((x & y) | (z & (x | y)))
885 : : #define F1(x,y,z) (z ^ (x & (y ^ z)))
886 : :
887 : : #define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + \
888 : : S0(W[t - 15]) + W[t - 16])
889 : :
890 : : #define P(a,b,c,d,e,f,g,h,x,K) G_STMT_START { \
891 : : temp1 = h + S3(e) + F1(e,f,g) + K + x; \
892 : : temp2 = S2(a) + F0(a,b,c); \
893 : : d += temp1; h = temp1 + temp2; } G_STMT_END
894 : :
895 : 101859 : A = buf[0];
896 : 101859 : B = buf[1];
897 : 101859 : C = buf[2];
898 : 101859 : D = buf[3];
899 : 101859 : E = buf[4];
900 : 101859 : F = buf[5];
901 : 101859 : G = buf[6];
902 : 101859 : H = buf[7];
903 : :
904 : 101859 : P (A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98);
905 : 101859 : P (H, A, B, C, D, E, F, G, W[ 1], 0x71374491);
906 : 101859 : P (G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF);
907 : 101859 : P (F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5);
908 : 101859 : P (E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B);
909 : 101859 : P (D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1);
910 : 101859 : P (C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4);
911 : 101859 : P (B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5);
912 : 101859 : P (A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98);
913 : 101859 : P (H, A, B, C, D, E, F, G, W[ 9], 0x12835B01);
914 : 101859 : P (G, H, A, B, C, D, E, F, W[10], 0x243185BE);
915 : 101859 : P (F, G, H, A, B, C, D, E, W[11], 0x550C7DC3);
916 : 101859 : P (E, F, G, H, A, B, C, D, W[12], 0x72BE5D74);
917 : 101859 : P (D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE);
918 : 101859 : P (C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7);
919 : 101859 : P (B, C, D, E, F, G, H, A, W[15], 0xC19BF174);
920 : 101859 : P (A, B, C, D, E, F, G, H, R(16), 0xE49B69C1);
921 : 101859 : P (H, A, B, C, D, E, F, G, R(17), 0xEFBE4786);
922 : 101859 : P (G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6);
923 : 101859 : P (F, G, H, A, B, C, D, E, R(19), 0x240CA1CC);
924 : 101859 : P (E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F);
925 : 101859 : P (D, E, F, G, H, A, B, C, R(21), 0x4A7484AA);
926 : 101859 : P (C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC);
927 : 101859 : P (B, C, D, E, F, G, H, A, R(23), 0x76F988DA);
928 : 101859 : P (A, B, C, D, E, F, G, H, R(24), 0x983E5152);
929 : 101859 : P (H, A, B, C, D, E, F, G, R(25), 0xA831C66D);
930 : 101859 : P (G, H, A, B, C, D, E, F, R(26), 0xB00327C8);
931 : 101859 : P (F, G, H, A, B, C, D, E, R(27), 0xBF597FC7);
932 : 101859 : P (E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3);
933 : 101859 : P (D, E, F, G, H, A, B, C, R(29), 0xD5A79147);
934 : 101859 : P (C, D, E, F, G, H, A, B, R(30), 0x06CA6351);
935 : 101859 : P (B, C, D, E, F, G, H, A, R(31), 0x14292967);
936 : 101859 : P (A, B, C, D, E, F, G, H, R(32), 0x27B70A85);
937 : 101859 : P (H, A, B, C, D, E, F, G, R(33), 0x2E1B2138);
938 : 101859 : P (G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC);
939 : 101859 : P (F, G, H, A, B, C, D, E, R(35), 0x53380D13);
940 : 101859 : P (E, F, G, H, A, B, C, D, R(36), 0x650A7354);
941 : 101859 : P (D, E, F, G, H, A, B, C, R(37), 0x766A0ABB);
942 : 101859 : P (C, D, E, F, G, H, A, B, R(38), 0x81C2C92E);
943 : 101859 : P (B, C, D, E, F, G, H, A, R(39), 0x92722C85);
944 : 101859 : P (A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1);
945 : 101859 : P (H, A, B, C, D, E, F, G, R(41), 0xA81A664B);
946 : 101859 : P (G, H, A, B, C, D, E, F, R(42), 0xC24B8B70);
947 : 101859 : P (F, G, H, A, B, C, D, E, R(43), 0xC76C51A3);
948 : 101859 : P (E, F, G, H, A, B, C, D, R(44), 0xD192E819);
949 : 101859 : P (D, E, F, G, H, A, B, C, R(45), 0xD6990624);
950 : 101859 : P (C, D, E, F, G, H, A, B, R(46), 0xF40E3585);
951 : 101859 : P (B, C, D, E, F, G, H, A, R(47), 0x106AA070);
952 : 101859 : P (A, B, C, D, E, F, G, H, R(48), 0x19A4C116);
953 : 101859 : P (H, A, B, C, D, E, F, G, R(49), 0x1E376C08);
954 : 101859 : P (G, H, A, B, C, D, E, F, R(50), 0x2748774C);
955 : 101859 : P (F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5);
956 : 101859 : P (E, F, G, H, A, B, C, D, R(52), 0x391C0CB3);
957 : 101859 : P (D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A);
958 : 101859 : P (C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F);
959 : 101859 : P (B, C, D, E, F, G, H, A, R(55), 0x682E6FF3);
960 : 101859 : P (A, B, C, D, E, F, G, H, R(56), 0x748F82EE);
961 : 101859 : P (H, A, B, C, D, E, F, G, R(57), 0x78A5636F);
962 : 101859 : P (G, H, A, B, C, D, E, F, R(58), 0x84C87814);
963 : 101859 : P (F, G, H, A, B, C, D, E, R(59), 0x8CC70208);
964 : 101859 : P (E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA);
965 : 101859 : P (D, E, F, G, H, A, B, C, R(61), 0xA4506CEB);
966 : 101859 : P (C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7);
967 : 101859 : P (B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
968 : :
969 : : #undef SHR
970 : : #undef ROTR
971 : : #undef S0
972 : : #undef S1
973 : : #undef S2
974 : : #undef S3
975 : : #undef F0
976 : : #undef F1
977 : : #undef R
978 : : #undef P
979 : :
980 : 101859 : buf[0] += A;
981 : 101859 : buf[1] += B;
982 : 101859 : buf[2] += C;
983 : 101859 : buf[3] += D;
984 : 101859 : buf[4] += E;
985 : 101859 : buf[5] += F;
986 : 101859 : buf[6] += G;
987 : 101859 : buf[7] += H;
988 : 101859 : }
989 : :
990 : : static void
991 : 297538 : sha256_sum_update (Sha256sum *sha256,
992 : : const guchar *buffer,
993 : : gsize length)
994 : : {
995 : : guint32 left, fill;
996 : 297538 : const guint8 *input = buffer;
997 : :
998 [ + + ]: 297538 : if (length == 0)
999 : 18 : return;
1000 : :
1001 : 297520 : left = sha256->bits[0] & 0x3F;
1002 : 297520 : fill = 64 - left;
1003 : :
1004 : 297520 : sha256->bits[0] += length;
1005 : 297520 : sha256->bits[0] &= 0xFFFFFFFF;
1006 : :
1007 [ - + ]: 297520 : if (sha256->bits[0] < length)
1008 : 0 : sha256->bits[1]++;
1009 : :
1010 [ + + + + ]: 297520 : if (left > 0 && length >= fill)
1011 : : {
1012 : 84008 : memcpy ((sha256->data + left), input, fill);
1013 : :
1014 : 84008 : sha256_transform (sha256->buf, sha256->data);
1015 : 84008 : length -= fill;
1016 : 84008 : input += fill;
1017 : :
1018 : 84008 : left = 0;
1019 : : }
1020 : :
1021 [ + + ]: 315371 : while (length >= SHA256_DATASIZE)
1022 : : {
1023 : 17851 : sha256_transform (sha256->buf, input);
1024 : :
1025 : 17851 : length -= 64;
1026 : 17851 : input += 64;
1027 : : }
1028 : :
1029 [ + + ]: 297520 : if (length)
1030 : 244175 : memcpy (sha256->data + left, input, length);
1031 : : }
1032 : :
1033 : : static guint8 sha256_padding[64] =
1034 : : {
1035 : : 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1036 : : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1037 : : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1038 : : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1039 : : };
1040 : :
1041 : : static void
1042 : 50399 : sha256_sum_close (Sha256sum *sha256)
1043 : : {
1044 : : guint32 last, padn;
1045 : : guint32 high, low;
1046 : : guint8 msglen[8];
1047 : :
1048 : 50399 : high = (sha256->bits[0] >> 29)
1049 : 50399 : | (sha256->bits[1] << 3);
1050 : 50399 : low = (sha256->bits[0] << 3);
1051 : :
1052 : 50399 : PUT_UINT32 (high, msglen, 0);
1053 : 50399 : PUT_UINT32 (low, msglen, 4);
1054 : :
1055 : 50399 : last = sha256->bits[0] & 0x3F;
1056 [ + + ]: 50399 : padn = (last < 56) ? (56 - last) : (120 - last);
1057 : :
1058 : 50399 : sha256_sum_update (sha256, sha256_padding, padn);
1059 : 50399 : sha256_sum_update (sha256, msglen, 8);
1060 : :
1061 : 50399 : PUT_UINT32 (sha256->buf[0], sha256->digest, 0);
1062 : 50399 : PUT_UINT32 (sha256->buf[1], sha256->digest, 4);
1063 : 50399 : PUT_UINT32 (sha256->buf[2], sha256->digest, 8);
1064 : 50399 : PUT_UINT32 (sha256->buf[3], sha256->digest, 12);
1065 : 50399 : PUT_UINT32 (sha256->buf[4], sha256->digest, 16);
1066 : 50399 : PUT_UINT32 (sha256->buf[5], sha256->digest, 20);
1067 : 50399 : PUT_UINT32 (sha256->buf[6], sha256->digest, 24);
1068 : 50399 : PUT_UINT32 (sha256->buf[7], sha256->digest, 28);
1069 : 50399 : }
1070 : :
1071 : : #undef PUT_UINT32
1072 : : #undef GET_UINT32
1073 : :
1074 : : static gchar *
1075 : 50399 : sha256_sum_to_string (Sha256sum *sha256)
1076 : : {
1077 : 50399 : return digest_to_string (sha256->digest, SHA256_DIGEST_LEN);
1078 : : }
1079 : :
1080 : : static void
1081 : 16711 : sha256_sum_digest (Sha256sum *sha256,
1082 : : guint8 *digest)
1083 : : {
1084 : : gint i;
1085 : :
1086 [ + + ]: 551463 : for (i = 0; i < SHA256_DIGEST_LEN; i++)
1087 : 534752 : digest[i] = sha256->digest[i];
1088 : 16711 : }
1089 : :
1090 : : /*
1091 : : * SHA-384, SHA-512, SHA-512/224 and SHA-512/256 Checksums
1092 : : *
1093 : : * Implemented following FIPS-180-4 standard at
1094 : : * http://csrc.nist.gov/publications/fips/fips180-4/fips180-4.pdf.
1095 : : * References in the form [§x.y.z] map to sections in that document.
1096 : : *
1097 : : * Author(s): Eduardo Lima Mitev <elima@igalia.com>
1098 : : * Igor Gnatenko <ignatenko@src.gnome.org>
1099 : : */
1100 : :
1101 : : /* SHA-384, SHA-512, SHA-512/224 and SHA-512/256 functions [§4.1.3] */
1102 : : #define Ch(x,y,z) ((x & y) ^ (~x & z))
1103 : : #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
1104 : : #define SHR(n,x) (x >> n)
1105 : : #define ROTR(n,x) (SHR (n, x) | (x << (64 - n)))
1106 : : #define SIGMA0(x) (ROTR (28, x) ^ ROTR (34, x) ^ ROTR (39, x))
1107 : : #define SIGMA1(x) (ROTR (14, x) ^ ROTR (18, x) ^ ROTR (41, x))
1108 : : #define sigma0(x) (ROTR ( 1, x) ^ ROTR ( 8, x) ^ SHR ( 7, x))
1109 : : #define sigma1(x) (ROTR (19, x) ^ ROTR (61, x) ^ SHR ( 6, x))
1110 : :
1111 : : #define PUT_UINT64(n,b,i) G_STMT_START{ \
1112 : : (b)[(i) ] = (guint8) (n >> 56); \
1113 : : (b)[(i) + 1] = (guint8) (n >> 48); \
1114 : : (b)[(i) + 2] = (guint8) (n >> 40); \
1115 : : (b)[(i) + 3] = (guint8) (n >> 32); \
1116 : : (b)[(i) + 4] = (guint8) (n >> 24); \
1117 : : (b)[(i) + 5] = (guint8) (n >> 16); \
1118 : : (b)[(i) + 6] = (guint8) (n >> 8); \
1119 : : (b)[(i) + 7] = (guint8) (n ); } G_STMT_END
1120 : :
1121 : : /* SHA-384 and SHA-512 constants [§4.2.3] */
1122 : : static const guint64 SHA2_K[80] = {
1123 : : G_GUINT64_CONSTANT (0x428a2f98d728ae22), G_GUINT64_CONSTANT (0x7137449123ef65cd),
1124 : : G_GUINT64_CONSTANT (0xb5c0fbcfec4d3b2f), G_GUINT64_CONSTANT (0xe9b5dba58189dbbc),
1125 : : G_GUINT64_CONSTANT (0x3956c25bf348b538), G_GUINT64_CONSTANT (0x59f111f1b605d019),
1126 : : G_GUINT64_CONSTANT (0x923f82a4af194f9b), G_GUINT64_CONSTANT (0xab1c5ed5da6d8118),
1127 : : G_GUINT64_CONSTANT (0xd807aa98a3030242), G_GUINT64_CONSTANT (0x12835b0145706fbe),
1128 : : G_GUINT64_CONSTANT (0x243185be4ee4b28c), G_GUINT64_CONSTANT (0x550c7dc3d5ffb4e2),
1129 : : G_GUINT64_CONSTANT (0x72be5d74f27b896f), G_GUINT64_CONSTANT (0x80deb1fe3b1696b1),
1130 : : G_GUINT64_CONSTANT (0x9bdc06a725c71235), G_GUINT64_CONSTANT (0xc19bf174cf692694),
1131 : : G_GUINT64_CONSTANT (0xe49b69c19ef14ad2), G_GUINT64_CONSTANT (0xefbe4786384f25e3),
1132 : : G_GUINT64_CONSTANT (0x0fc19dc68b8cd5b5), G_GUINT64_CONSTANT (0x240ca1cc77ac9c65),
1133 : : G_GUINT64_CONSTANT (0x2de92c6f592b0275), G_GUINT64_CONSTANT (0x4a7484aa6ea6e483),
1134 : : G_GUINT64_CONSTANT (0x5cb0a9dcbd41fbd4), G_GUINT64_CONSTANT (0x76f988da831153b5),
1135 : : G_GUINT64_CONSTANT (0x983e5152ee66dfab), G_GUINT64_CONSTANT (0xa831c66d2db43210),
1136 : : G_GUINT64_CONSTANT (0xb00327c898fb213f), G_GUINT64_CONSTANT (0xbf597fc7beef0ee4),
1137 : : G_GUINT64_CONSTANT (0xc6e00bf33da88fc2), G_GUINT64_CONSTANT (0xd5a79147930aa725),
1138 : : G_GUINT64_CONSTANT (0x06ca6351e003826f), G_GUINT64_CONSTANT (0x142929670a0e6e70),
1139 : : G_GUINT64_CONSTANT (0x27b70a8546d22ffc), G_GUINT64_CONSTANT (0x2e1b21385c26c926),
1140 : : G_GUINT64_CONSTANT (0x4d2c6dfc5ac42aed), G_GUINT64_CONSTANT (0x53380d139d95b3df),
1141 : : G_GUINT64_CONSTANT (0x650a73548baf63de), G_GUINT64_CONSTANT (0x766a0abb3c77b2a8),
1142 : : G_GUINT64_CONSTANT (0x81c2c92e47edaee6), G_GUINT64_CONSTANT (0x92722c851482353b),
1143 : : G_GUINT64_CONSTANT (0xa2bfe8a14cf10364), G_GUINT64_CONSTANT (0xa81a664bbc423001),
1144 : : G_GUINT64_CONSTANT (0xc24b8b70d0f89791), G_GUINT64_CONSTANT (0xc76c51a30654be30),
1145 : : G_GUINT64_CONSTANT (0xd192e819d6ef5218), G_GUINT64_CONSTANT (0xd69906245565a910),
1146 : : G_GUINT64_CONSTANT (0xf40e35855771202a), G_GUINT64_CONSTANT (0x106aa07032bbd1b8),
1147 : : G_GUINT64_CONSTANT (0x19a4c116b8d2d0c8), G_GUINT64_CONSTANT (0x1e376c085141ab53),
1148 : : G_GUINT64_CONSTANT (0x2748774cdf8eeb99), G_GUINT64_CONSTANT (0x34b0bcb5e19b48a8),
1149 : : G_GUINT64_CONSTANT (0x391c0cb3c5c95a63), G_GUINT64_CONSTANT (0x4ed8aa4ae3418acb),
1150 : : G_GUINT64_CONSTANT (0x5b9cca4f7763e373), G_GUINT64_CONSTANT (0x682e6ff3d6b2b8a3),
1151 : : G_GUINT64_CONSTANT (0x748f82ee5defb2fc), G_GUINT64_CONSTANT (0x78a5636f43172f60),
1152 : : G_GUINT64_CONSTANT (0x84c87814a1f0ab72), G_GUINT64_CONSTANT (0x8cc702081a6439ec),
1153 : : G_GUINT64_CONSTANT (0x90befffa23631e28), G_GUINT64_CONSTANT (0xa4506cebde82bde9),
1154 : : G_GUINT64_CONSTANT (0xbef9a3f7b2c67915), G_GUINT64_CONSTANT (0xc67178f2e372532b),
1155 : : G_GUINT64_CONSTANT (0xca273eceea26619c), G_GUINT64_CONSTANT (0xd186b8c721c0c207),
1156 : : G_GUINT64_CONSTANT (0xeada7dd6cde0eb1e), G_GUINT64_CONSTANT (0xf57d4f7fee6ed178),
1157 : : G_GUINT64_CONSTANT (0x06f067aa72176fba), G_GUINT64_CONSTANT (0x0a637dc5a2c898a6),
1158 : : G_GUINT64_CONSTANT (0x113f9804bef90dae), G_GUINT64_CONSTANT (0x1b710b35131c471b),
1159 : : G_GUINT64_CONSTANT (0x28db77f523047d84), G_GUINT64_CONSTANT (0x32caab7b40c72493),
1160 : : G_GUINT64_CONSTANT (0x3c9ebe0a15c9bebc), G_GUINT64_CONSTANT (0x431d67c49c100d4c),
1161 : : G_GUINT64_CONSTANT (0x4cc5d4becb3e42b6), G_GUINT64_CONSTANT (0x597f299cfc657e2a),
1162 : : G_GUINT64_CONSTANT (0x5fcb6fab3ad6faec), G_GUINT64_CONSTANT (0x6c44198c4a475817)
1163 : : };
1164 : :
1165 : :
1166 : : static void
1167 : 33873 : sha384_sum_init (Sha512sum *sha512)
1168 : : {
1169 : : /* Initial Hash Value [§5.3.4] */
1170 : 33873 : sha512->H[0] = G_GUINT64_CONSTANT (0xcbbb9d5dc1059ed8);
1171 : 33873 : sha512->H[1] = G_GUINT64_CONSTANT (0x629a292a367cd507);
1172 : 33873 : sha512->H[2] = G_GUINT64_CONSTANT (0x9159015a3070dd17);
1173 : 33873 : sha512->H[3] = G_GUINT64_CONSTANT (0x152fecd8f70e5939);
1174 : 33873 : sha512->H[4] = G_GUINT64_CONSTANT (0x67332667ffc00b31);
1175 : 33873 : sha512->H[5] = G_GUINT64_CONSTANT (0x8eb44a8768581511);
1176 : 33873 : sha512->H[6] = G_GUINT64_CONSTANT (0xdb0c2e0d64f98fa7);
1177 : 33873 : sha512->H[7] = G_GUINT64_CONSTANT (0x47b5481dbefa4fa4);
1178 : :
1179 : 33873 : sha512->block_len = 0;
1180 : :
1181 : 33873 : sha512->data_len[0] = 0;
1182 : 33873 : sha512->data_len[1] = 0;
1183 : 33873 : }
1184 : :
1185 : : static void
1186 : 33874 : sha512_sum_init (Sha512sum *sha512)
1187 : : {
1188 : : /* Initial Hash Value [§5.3.5] */
1189 : 33874 : sha512->H[0] = G_GUINT64_CONSTANT (0x6a09e667f3bcc908);
1190 : 33874 : sha512->H[1] = G_GUINT64_CONSTANT (0xbb67ae8584caa73b);
1191 : 33874 : sha512->H[2] = G_GUINT64_CONSTANT (0x3c6ef372fe94f82b);
1192 : 33874 : sha512->H[3] = G_GUINT64_CONSTANT (0xa54ff53a5f1d36f1);
1193 : 33874 : sha512->H[4] = G_GUINT64_CONSTANT (0x510e527fade682d1);
1194 : 33874 : sha512->H[5] = G_GUINT64_CONSTANT (0x9b05688c2b3e6c1f);
1195 : 33874 : sha512->H[6] = G_GUINT64_CONSTANT (0x1f83d9abfb41bd6b);
1196 : 33874 : sha512->H[7] = G_GUINT64_CONSTANT (0x5be0cd19137e2179);
1197 : :
1198 : 33874 : sha512->block_len = 0;
1199 : :
1200 : 33874 : sha512->data_len[0] = 0;
1201 : 33874 : sha512->data_len[1] = 0;
1202 : 33874 : }
1203 : :
1204 : : static void
1205 : 146988 : sha512_transform (guint64 H[8],
1206 : : guint8 const data[SHA2_BLOCK_LEN])
1207 : : {
1208 : : gint i;
1209 : : gint t;
1210 : : guint64 a, b, c, d, e, f, g, h;
1211 : : guint64 M[16];
1212 : : guint64 W[80];
1213 : :
1214 : : /* SHA-512 hash computation [§6.4.2] */
1215 : :
1216 : : /* prepare the message schedule */
1217 [ + + ]: 2498796 : for (i = 0; i < 16; i++)
1218 : : {
1219 : 2351808 : gint p = i * 8;
1220 : :
1221 : 2351808 : M[i] =
1222 : 2351808 : ((guint64) data[p + 0] << 56) |
1223 : 2351808 : ((guint64) data[p + 1] << 48) |
1224 : 2351808 : ((guint64) data[p + 2] << 40) |
1225 : 2351808 : ((guint64) data[p + 3] << 32) |
1226 : 2351808 : ((guint64) data[p + 4] << 24) |
1227 : 2351808 : ((guint64) data[p + 5] << 16) |
1228 : 2351808 : ((guint64) data[p + 6] << 8) |
1229 : 2351808 : ((guint64) data[p + 7] );
1230 : : }
1231 : :
1232 [ + + ]: 11906028 : for (t = 0; t < 80; t++)
1233 [ + + ]: 11759040 : if (t < 16)
1234 : 2351808 : W[t] = M[t];
1235 : : else
1236 : 9407232 : W[t] = sigma1 (W[t - 2]) + W[t - 7] + sigma0 (W[t - 15]) + W[t - 16];
1237 : :
1238 : : /* initialize the eight working variables */
1239 : 146988 : a = H[0];
1240 : 146988 : b = H[1];
1241 : 146988 : c = H[2];
1242 : 146988 : d = H[3];
1243 : 146988 : e = H[4];
1244 : 146988 : f = H[5];
1245 : 146988 : g = H[6];
1246 : 146988 : h = H[7];
1247 : :
1248 [ + + ]: 11906028 : for (t = 0; t < 80; t++)
1249 : : {
1250 : : guint64 T1, T2;
1251 : :
1252 : 11759040 : T1 = h + SIGMA1 (e) + Ch (e, f, g) + SHA2_K[t] + W[t];
1253 : 11759040 : T2 = SIGMA0 (a) + Maj (a, b, c);
1254 : 11759040 : h = g;
1255 : 11759040 : g = f;
1256 : 11759040 : f = e;
1257 : 11759040 : e = d + T1;
1258 : 11759040 : d = c;
1259 : 11759040 : c = b;
1260 : 11759040 : b = a;
1261 : 11759040 : a = T1 + T2;
1262 : : }
1263 : :
1264 : : /* Compute the intermediate hash value H */
1265 : 146988 : H[0] += a;
1266 : 146988 : H[1] += b;
1267 : 146988 : H[2] += c;
1268 : 146988 : H[3] += d;
1269 : 146988 : H[4] += e;
1270 : 146988 : H[5] += f;
1271 : 146988 : H[6] += g;
1272 : 146988 : H[7] += h;
1273 : 146988 : }
1274 : :
1275 : : static void
1276 : 494046 : sha512_sum_update (Sha512sum *sha512,
1277 : : const guchar *buffer,
1278 : : gsize length)
1279 : : {
1280 : 494046 : gsize block_left, offset = 0;
1281 : :
1282 [ + + ]: 494046 : if (length == 0)
1283 : 4 : return;
1284 : :
1285 : 494042 : sha512->data_len[0] += length * 8;
1286 [ - + ]: 494042 : if (sha512->data_len[0] < length)
1287 : 0 : sha512->data_len[1]++;
1288 : :
1289 : : /* try to fill current block */
1290 : 494042 : block_left = SHA2_BLOCK_LEN - sha512->block_len;
1291 [ + - ]: 494042 : if (block_left > 0)
1292 : : {
1293 : : gsize fill_len;
1294 : :
1295 : 494042 : fill_len = MIN (block_left, length);
1296 : 494042 : memcpy (sha512->block + sha512->block_len, buffer, fill_len);
1297 : 494042 : sha512->block_len += fill_len;
1298 : 494042 : length -= fill_len;
1299 : 494042 : offset += fill_len;
1300 : :
1301 [ + + ]: 494042 : if (sha512->block_len == SHA2_BLOCK_LEN)
1302 : : {
1303 : 135548 : sha512_transform (sha512->H, sha512->block);
1304 : 135548 : sha512->block_len = 0;
1305 : : }
1306 : : }
1307 : :
1308 : : /* process complete blocks */
1309 [ + + ]: 505482 : while (length >= SHA2_BLOCK_LEN)
1310 : : {
1311 : 11440 : memcpy (sha512->block, buffer + offset, SHA2_BLOCK_LEN);
1312 : :
1313 : 11440 : sha512_transform (sha512->H, sha512->block);
1314 : :
1315 : 11440 : length -= SHA2_BLOCK_LEN;
1316 : 11440 : offset += SHA2_BLOCK_LEN;
1317 : : }
1318 : :
1319 : : /* keep remaining data for next block */
1320 [ + + ]: 494042 : if (length > 0)
1321 : : {
1322 : 32568 : memcpy (sha512->block, buffer + offset, length);
1323 : 32568 : sha512->block_len = length;
1324 : : }
1325 : : }
1326 : :
1327 : : static void
1328 : 100684 : sha512_sum_close (Sha512sum *sha512)
1329 : : {
1330 : : guint l;
1331 : : gint zeros;
1332 : 100684 : guint8 pad[SHA2_BLOCK_LEN * 2] = { 0, };
1333 : 100684 : guint pad_len = 0;
1334 : : gint i;
1335 : :
1336 : : /* apply padding [§5.1.2] */
1337 : 100684 : l = sha512->block_len * 8;
1338 : 100684 : zeros = 896 - (l + 1);
1339 : :
1340 [ + + ]: 100684 : if (zeros < 0)
1341 : 11440 : zeros += 128 * 8;
1342 : :
1343 : 100684 : pad[0] = 0x80; /* 1000 0000 */
1344 : 100684 : zeros -= 7;
1345 : 100684 : pad_len++;
1346 : :
1347 : 100684 : memset (pad + pad_len, 0x00, zeros / 8);
1348 : 100684 : pad_len += zeros / 8;
1349 : 100684 : zeros = zeros % 8;
1350 : : (void) zeros; /* don’t care about the dead store */
1351 : :
1352 : : /* put message bit length at the end of padding */
1353 : 100684 : PUT_UINT64 (sha512->data_len[1], pad, pad_len);
1354 : 100684 : pad_len += 8;
1355 : :
1356 : 100684 : PUT_UINT64 (sha512->data_len[0], pad, pad_len);
1357 : 100684 : pad_len += 8;
1358 : :
1359 : : /* update checksum with the padded block */
1360 : 100684 : sha512_sum_update (sha512, pad, pad_len);
1361 : :
1362 : : /* copy resulting 64-bit words into digest */
1363 [ + + ]: 906156 : for (i = 0; i < 8; i++)
1364 : 805472 : PUT_UINT64 (sha512->H[i], sha512->digest, i * 8);
1365 : 100684 : }
1366 : :
1367 : : static gchar *
1368 : 50342 : sha384_sum_to_string (Sha512sum *sha512)
1369 : : {
1370 : 50342 : return digest_to_string (sha512->digest, SHA384_DIGEST_LEN);
1371 : : }
1372 : :
1373 : : static gchar *
1374 : 50342 : sha512_sum_to_string (Sha512sum *sha512)
1375 : : {
1376 : 50342 : return digest_to_string (sha512->digest, SHA512_DIGEST_LEN);
1377 : : }
1378 : :
1379 : : static void
1380 : 16667 : sha384_sum_digest (Sha512sum *sha512,
1381 : : guint8 *digest)
1382 : : {
1383 : 16667 : memcpy (digest, sha512->digest, SHA384_DIGEST_LEN);
1384 : 16667 : }
1385 : :
1386 : : static void
1387 : 16667 : sha512_sum_digest (Sha512sum *sha512,
1388 : : guint8 *digest)
1389 : : {
1390 : 16667 : memcpy (digest, sha512->digest, SHA512_DIGEST_LEN);
1391 : 16667 : }
1392 : :
1393 : : #undef Ch
1394 : : #undef Maj
1395 : : #undef SHR
1396 : : #undef ROTR
1397 : : #undef SIGMA0
1398 : : #undef SIGMA1
1399 : : #undef sigma0
1400 : : #undef sigma1
1401 : :
1402 : : #undef PUT_UINT64
1403 : :
1404 : : /*
1405 : : * Public API
1406 : : */
1407 : :
1408 : : /**
1409 : : * g_checksum_type_get_length:
1410 : : * @checksum_type: a #GChecksumType
1411 : : *
1412 : : * Gets the length in bytes of digests of type @checksum_type
1413 : : *
1414 : : * Returns: the checksum length, or -1 if @checksum_type is
1415 : : * not supported.
1416 : : *
1417 : : * Since: 2.16
1418 : : */
1419 : : gssize
1420 : 166741 : g_checksum_type_get_length (GChecksumType checksum_type)
1421 : : {
1422 : 166741 : gssize len = -1;
1423 : :
1424 [ + + + + : 166741 : switch (checksum_type)
+ + ]
1425 : : {
1426 : 33336 : case G_CHECKSUM_MD5:
1427 : 33336 : len = MD5_DIGEST_LEN;
1428 : 33336 : break;
1429 : 33360 : case G_CHECKSUM_SHA1:
1430 : 33360 : len = SHA1_DIGEST_LEN;
1431 : 33360 : break;
1432 : 33380 : case G_CHECKSUM_SHA256:
1433 : 33380 : len = SHA256_DIGEST_LEN;
1434 : 33380 : break;
1435 : 33332 : case G_CHECKSUM_SHA384:
1436 : 33332 : len = SHA384_DIGEST_LEN;
1437 : 33332 : break;
1438 : 33332 : case G_CHECKSUM_SHA512:
1439 : 33332 : len = SHA512_DIGEST_LEN;
1440 : 33332 : break;
1441 : 1 : default:
1442 : 1 : len = -1;
1443 : 1 : break;
1444 : : }
1445 : :
1446 : 166741 : return len;
1447 : : }
1448 : :
1449 : : /**
1450 : : * g_checksum_new:
1451 : : * @checksum_type: the desired type of checksum
1452 : : *
1453 : : * Creates a new #GChecksum, using the checksum algorithm @checksum_type.
1454 : : * If the @checksum_type is not known, %NULL is returned.
1455 : : * A #GChecksum can be used to compute the checksum, or digest, of an
1456 : : * arbitrary binary blob, using different hashing algorithms.
1457 : : *
1458 : : * A #GChecksum works by feeding a binary blob through g_checksum_update()
1459 : : * until there is data to be checked; the digest can then be extracted
1460 : : * using g_checksum_get_string(), which will return the checksum as a
1461 : : * hexadecimal string; or g_checksum_get_digest(), which will return a
1462 : : * vector of raw bytes. Once either g_checksum_get_string() or
1463 : : * g_checksum_get_digest() have been called on a #GChecksum, the checksum
1464 : : * will be closed and it won't be possible to call g_checksum_update()
1465 : : * on it anymore.
1466 : : *
1467 : : * Returns: (transfer full) (nullable): the newly created #GChecksum, or %NULL.
1468 : : * Use g_checksum_free() to free the memory allocated by it.
1469 : : *
1470 : : * Since: 2.16
1471 : : */
1472 : : GChecksum *
1473 : 86783 : g_checksum_new (GChecksumType checksum_type)
1474 : : {
1475 : : GChecksum *checksum;
1476 : :
1477 [ + + ]: 86783 : if (! IS_VALID_TYPE (checksum_type))
1478 : 1 : return NULL;
1479 : :
1480 : 86782 : checksum = g_slice_new0 (GChecksum);
1481 : 86782 : checksum->type = checksum_type;
1482 : :
1483 : 86782 : g_checksum_reset (checksum);
1484 : :
1485 : 86782 : return checksum;
1486 : : }
1487 : :
1488 : : /**
1489 : : * g_checksum_reset:
1490 : : * @checksum: the #GChecksum to reset
1491 : : *
1492 : : * Resets the state of the @checksum back to its initial state.
1493 : : *
1494 : : * Since: 2.18
1495 : : **/
1496 : : void
1497 : 170057 : g_checksum_reset (GChecksum *checksum)
1498 : : {
1499 : 170057 : g_return_if_fail (checksum != NULL);
1500 : :
1501 : 170057 : g_free (checksum->digest_str);
1502 : 170057 : checksum->digest_str = NULL;
1503 : :
1504 [ + + + + : 170057 : switch (checksum->type)
+ - ]
1505 : : {
1506 : 34413 : case G_CHECKSUM_MD5:
1507 : 34413 : md5_sum_init (&(checksum->sum.md5));
1508 : 34413 : break;
1509 : 33966 : case G_CHECKSUM_SHA1:
1510 : 33966 : sha1_sum_init (&(checksum->sum.sha1));
1511 : 33966 : break;
1512 : 33931 : case G_CHECKSUM_SHA256:
1513 : 33931 : sha256_sum_init (&(checksum->sum.sha256));
1514 : 33931 : break;
1515 : 33873 : case G_CHECKSUM_SHA384:
1516 : 33873 : sha384_sum_init (&(checksum->sum.sha512));
1517 : 33873 : break;
1518 : 33874 : case G_CHECKSUM_SHA512:
1519 : 33874 : sha512_sum_init (&(checksum->sum.sha512));
1520 : 33874 : break;
1521 : 0 : default:
1522 : : g_assert_not_reached ();
1523 : : break;
1524 : : }
1525 : : }
1526 : :
1527 : : /**
1528 : : * g_checksum_copy:
1529 : : * @checksum: the #GChecksum to copy
1530 : : *
1531 : : * Copies a #GChecksum. If @checksum has been closed, by calling
1532 : : * g_checksum_get_string() or g_checksum_get_digest(), the copied
1533 : : * checksum will be closed as well.
1534 : : *
1535 : : * Returns: (transfer full): the copy of the passed #GChecksum. Use
1536 : : * g_checksum_free() when finished using it.
1537 : : *
1538 : : * Since: 2.16
1539 : : */
1540 : : GChecksum *
1541 : 83268 : g_checksum_copy (const GChecksum *checksum)
1542 : : {
1543 : : GChecksum *copy;
1544 : :
1545 : 83268 : g_return_val_if_fail (checksum != NULL, NULL);
1546 : :
1547 : 83268 : copy = g_slice_new (GChecksum);
1548 : 83268 : *copy = *checksum;
1549 : :
1550 : 83268 : copy->digest_str = g_strdup (checksum->digest_str);
1551 : :
1552 : 83268 : return copy;
1553 : : }
1554 : :
1555 : : /**
1556 : : * g_checksum_free:
1557 : : * @checksum: a #GChecksum
1558 : : *
1559 : : * Frees the memory allocated for @checksum.
1560 : : *
1561 : : * Since: 2.16
1562 : : */
1563 : : void
1564 : 170050 : g_checksum_free (GChecksum *checksum)
1565 : : {
1566 [ + - ]: 170050 : if (G_LIKELY (checksum))
1567 : : {
1568 : 170050 : g_free (checksum->digest_str);
1569 : :
1570 : 170050 : g_slice_free (GChecksum, checksum);
1571 : : }
1572 : 170050 : }
1573 : :
1574 : : /**
1575 : : * g_checksum_update:
1576 : : * @checksum: a #GChecksum
1577 : : * @data: (array length=length) (element-type guint8): buffer used to compute the checksum
1578 : : * @length: size of the buffer, or -1 if it is a null-terminated string.
1579 : : *
1580 : : * Feeds @data into an existing #GChecksum. The checksum must still be
1581 : : * open, that is g_checksum_get_string() or g_checksum_get_digest() must
1582 : : * not have been called on @checksum.
1583 : : *
1584 : : * Since: 2.16
1585 : : */
1586 : : void
1587 : 984113 : g_checksum_update (GChecksum *checksum,
1588 : : const guchar *data,
1589 : : gssize length)
1590 : : {
1591 : 984113 : g_return_if_fail (checksum != NULL);
1592 : 984113 : g_return_if_fail (length == 0 || data != NULL);
1593 : :
1594 [ - + ]: 984113 : if (length < 0)
1595 : 0 : length = strlen ((const gchar *) data);
1596 : :
1597 [ - + ]: 984113 : if (checksum->digest_str)
1598 : : {
1599 : 0 : g_warning ("The checksum '%s' has been closed and cannot be updated "
1600 : : "anymore.",
1601 : : checksum->digest_str);
1602 : 0 : return;
1603 : : }
1604 : :
1605 [ + + + + : 984113 : switch (checksum->type)
- ]
1606 : : {
1607 : 197223 : case G_CHECKSUM_MD5:
1608 : 197223 : md5_sum_update (&(checksum->sum.md5), data, length);
1609 : 197223 : break;
1610 : 196788 : case G_CHECKSUM_SHA1:
1611 : 196788 : sha1_sum_update (&(checksum->sum.sha1), data, length);
1612 : 196788 : break;
1613 : 196740 : case G_CHECKSUM_SHA256:
1614 : 196740 : sha256_sum_update (&(checksum->sum.sha256), data, length);
1615 : 196740 : break;
1616 : 393362 : case G_CHECKSUM_SHA384:
1617 : : case G_CHECKSUM_SHA512:
1618 : 393362 : sha512_sum_update (&(checksum->sum.sha512), data, length);
1619 : 393362 : break;
1620 : 0 : default:
1621 : : g_assert_not_reached ();
1622 : : break;
1623 : : }
1624 : : }
1625 : :
1626 : : /**
1627 : : * g_checksum_get_string:
1628 : : * @checksum: a #GChecksum
1629 : : *
1630 : : * Gets the digest as a hexadecimal string.
1631 : : *
1632 : : * Once this function has been called the #GChecksum can no longer be
1633 : : * updated with g_checksum_update().
1634 : : *
1635 : : * The hexadecimal characters will be lower case.
1636 : : *
1637 : : * Returns: the hexadecimal representation of the checksum. The
1638 : : * returned string is owned by the checksum and should not be modified
1639 : : * or freed.
1640 : : *
1641 : : * Since: 2.16
1642 : : */
1643 : : const gchar *
1644 : 169011 : g_checksum_get_string (GChecksum *checksum)
1645 : : {
1646 : 169011 : gchar *str = NULL;
1647 : :
1648 : 169011 : g_return_val_if_fail (checksum != NULL, NULL);
1649 : :
1650 [ + + ]: 169011 : if (checksum->digest_str)
1651 : 8 : return checksum->digest_str;
1652 : :
1653 [ + + + + : 169003 : switch (checksum->type)
+ - ]
1654 : : {
1655 : 34213 : case G_CHECKSUM_MD5:
1656 : 34213 : md5_sum_close (&(checksum->sum.md5));
1657 : 34213 : str = md5_sum_to_string (&(checksum->sum.md5));
1658 : 34213 : break;
1659 : 33752 : case G_CHECKSUM_SHA1:
1660 : 33752 : sha1_sum_close (&(checksum->sum.sha1));
1661 : 33752 : str = sha1_sum_to_string (&(checksum->sum.sha1));
1662 : 33752 : break;
1663 : 33688 : case G_CHECKSUM_SHA256:
1664 : 33688 : sha256_sum_close (&(checksum->sum.sha256));
1665 : 33688 : str = sha256_sum_to_string (&(checksum->sum.sha256));
1666 : 33688 : break;
1667 : 33675 : case G_CHECKSUM_SHA384:
1668 : 33675 : sha512_sum_close (&(checksum->sum.sha512));
1669 : 33675 : str = sha384_sum_to_string (&(checksum->sum.sha512));
1670 : 33675 : break;
1671 : 33675 : case G_CHECKSUM_SHA512:
1672 : 33675 : sha512_sum_close (&(checksum->sum.sha512));
1673 : 33675 : str = sha512_sum_to_string (&(checksum->sum.sha512));
1674 : 33675 : break;
1675 : 0 : default:
1676 : : g_assert_not_reached ();
1677 : : break;
1678 : : }
1679 : :
1680 : 169003 : checksum->digest_str = str;
1681 : :
1682 : 169003 : return checksum->digest_str;
1683 : : }
1684 : :
1685 : : /**
1686 : : * g_checksum_get_digest: (skip)
1687 : : * @checksum: a #GChecksum
1688 : : * @buffer: (array length=digest_len): output buffer
1689 : : * @digest_len: (inout): an inout parameter. The caller initializes it to the size of @buffer.
1690 : : * After the call it contains the length of the digest.
1691 : : *
1692 : : * Gets the digest from @checksum as a raw binary vector and places it
1693 : : * into @buffer. The size of the digest depends on the type of checksum.
1694 : : *
1695 : : * Once this function has been called, the #GChecksum is closed and can
1696 : : * no longer be updated with g_checksum_update().
1697 : : *
1698 : : * Since: 2.16
1699 : : */
1700 : : void
1701 : 83395 : g_checksum_get_digest (GChecksum *checksum,
1702 : : guint8 *buffer,
1703 : : gsize *digest_len)
1704 : : {
1705 : 83395 : gboolean checksum_open = FALSE;
1706 : 83395 : gchar *str = NULL;
1707 : : gsize len;
1708 : :
1709 : 83395 : g_return_if_fail (checksum != NULL);
1710 : :
1711 : 83395 : len = g_checksum_type_get_length (checksum->type);
1712 : 83395 : g_return_if_fail (*digest_len >= len);
1713 : :
1714 : 83395 : checksum_open = !!(checksum->digest_str == NULL);
1715 : :
1716 [ + + + + : 83395 : switch (checksum->type)
+ - ]
1717 : : {
1718 : 16669 : case G_CHECKSUM_MD5:
1719 [ + - ]: 16669 : if (checksum_open)
1720 : : {
1721 : 16669 : md5_sum_close (&(checksum->sum.md5));
1722 : 16669 : str = md5_sum_to_string (&(checksum->sum.md5));
1723 : : }
1724 : 16669 : md5_sum_digest (&(checksum->sum.md5), buffer);
1725 : 16669 : break;
1726 : 16681 : case G_CHECKSUM_SHA1:
1727 [ + - ]: 16681 : if (checksum_open)
1728 : : {
1729 : 16681 : sha1_sum_close (&(checksum->sum.sha1));
1730 : 16681 : str = sha1_sum_to_string (&(checksum->sum.sha1));
1731 : : }
1732 : 16681 : sha1_sum_digest (&(checksum->sum.sha1), buffer);
1733 : 16681 : break;
1734 : 16711 : case G_CHECKSUM_SHA256:
1735 [ + - ]: 16711 : if (checksum_open)
1736 : : {
1737 : 16711 : sha256_sum_close (&(checksum->sum.sha256));
1738 : 16711 : str = sha256_sum_to_string (&(checksum->sum.sha256));
1739 : : }
1740 : 16711 : sha256_sum_digest (&(checksum->sum.sha256), buffer);
1741 : 16711 : break;
1742 : 16667 : case G_CHECKSUM_SHA384:
1743 [ + - ]: 16667 : if (checksum_open)
1744 : : {
1745 : 16667 : sha512_sum_close (&(checksum->sum.sha512));
1746 : 16667 : str = sha384_sum_to_string (&(checksum->sum.sha512));
1747 : : }
1748 : 16667 : sha384_sum_digest (&(checksum->sum.sha512), buffer);
1749 : 16667 : break;
1750 : 16667 : case G_CHECKSUM_SHA512:
1751 [ + - ]: 16667 : if (checksum_open)
1752 : : {
1753 : 16667 : sha512_sum_close (&(checksum->sum.sha512));
1754 : 16667 : str = sha512_sum_to_string (&(checksum->sum.sha512));
1755 : : }
1756 : 16667 : sha512_sum_digest (&(checksum->sum.sha512), buffer);
1757 : 16667 : break;
1758 : 0 : default:
1759 : : g_assert_not_reached ();
1760 : : break;
1761 : : }
1762 : :
1763 [ + - ]: 83395 : if (str)
1764 : 83395 : checksum->digest_str = str;
1765 : :
1766 : 83395 : *digest_len = len;
1767 : : }
1768 : :
1769 : : /**
1770 : : * g_compute_checksum_for_data:
1771 : : * @checksum_type: a #GChecksumType
1772 : : * @data: (array length=length) (element-type guint8): binary blob to compute the digest of
1773 : : * @length: length of @data
1774 : : *
1775 : : * Computes the checksum for a binary @data of @length. This is a
1776 : : * convenience wrapper for g_checksum_new(), g_checksum_get_string()
1777 : : * and g_checksum_free().
1778 : : *
1779 : : * The hexadecimal string returned will be in lower case.
1780 : : *
1781 : : * Returns: (transfer full) (nullable): the digest of the binary data as a
1782 : : * string in hexadecimal, or %NULL if g_checksum_new() fails for
1783 : : * @checksum_type. The returned string should be freed with g_free() when
1784 : : * done using it.
1785 : : *
1786 : : * Since: 2.16
1787 : : */
1788 : : gchar *
1789 : 1935 : g_compute_checksum_for_data (GChecksumType checksum_type,
1790 : : const guchar *data,
1791 : : gsize length)
1792 : : {
1793 : : GChecksum *checksum;
1794 : : gchar *retval;
1795 : :
1796 : 1935 : g_return_val_if_fail (length == 0 || data != NULL, NULL);
1797 : :
1798 : 1935 : checksum = g_checksum_new (checksum_type);
1799 [ - + ]: 1935 : if (!checksum)
1800 : 0 : return NULL;
1801 : :
1802 : 1935 : g_checksum_update (checksum, data, length);
1803 : 1935 : retval = g_strdup (g_checksum_get_string (checksum));
1804 : 1935 : g_checksum_free (checksum);
1805 : :
1806 : 1935 : return retval;
1807 : : }
1808 : :
1809 : : /**
1810 : : * g_compute_checksum_for_string:
1811 : : * @checksum_type: a #GChecksumType
1812 : : * @str: the string to compute the checksum of
1813 : : * @length: the length of the string, or -1 if the string is null-terminated.
1814 : : *
1815 : : * Computes the checksum of a string.
1816 : : *
1817 : : * The hexadecimal string returned will be in lower case.
1818 : : *
1819 : : * Returns: (transfer full) (nullable): the checksum as a hexadecimal string,
1820 : : * or %NULL if g_checksum_new() fails for @checksum_type. The returned string
1821 : : * should be freed with g_free() when done using it.
1822 : : *
1823 : : * Since: 2.16
1824 : : */
1825 : : gchar *
1826 : 1002 : g_compute_checksum_for_string (GChecksumType checksum_type,
1827 : : const gchar *str,
1828 : : gssize length)
1829 : : {
1830 : 1002 : g_return_val_if_fail (length == 0 || str != NULL, NULL);
1831 : :
1832 [ + + ]: 1002 : if (length < 0)
1833 : 82 : length = strlen (str);
1834 : :
1835 : 1002 : return g_compute_checksum_for_data (checksum_type, (const guchar *) str, length);
1836 : : }
1837 : :
1838 : : /**
1839 : : * g_compute_checksum_for_bytes:
1840 : : * @checksum_type: a #GChecksumType
1841 : : * @data: binary blob to compute the digest of
1842 : : *
1843 : : * Computes the checksum for a binary @data. This is a
1844 : : * convenience wrapper for g_checksum_new(), g_checksum_get_string()
1845 : : * and g_checksum_free().
1846 : : *
1847 : : * The hexadecimal string returned will be in lower case.
1848 : : *
1849 : : * Returns: (transfer full) (nullable): the digest of the binary data as a
1850 : : * string in hexadecimal, or %NULL if g_checksum_new() fails for
1851 : : * @checksum_type. The returned string should be freed with g_free() when
1852 : : * done using it.
1853 : : *
1854 : : * Since: 2.34
1855 : : */
1856 : : gchar *
1857 : 920 : g_compute_checksum_for_bytes (GChecksumType checksum_type,
1858 : : GBytes *data)
1859 : : {
1860 : : gconstpointer byte_data;
1861 : : gsize length;
1862 : :
1863 : 920 : g_return_val_if_fail (data != NULL, NULL);
1864 : :
1865 : 920 : byte_data = g_bytes_get_data (data, &length);
1866 : 920 : return g_compute_checksum_for_data (checksum_type, byte_data, length);
1867 : : }
|