annotate src/md5.c @ 8461:16485e87b7bb

[gaim-migrate @ 9191] Fix a problem displaying AIM tooltips with the dude or chick has an away message containing an unmatched < This breaks the string freeze horrendously. I'm afraid every string for every language will have to be retranslated. Sorry. Just kidding. Really. Don't hate me because I'm beautiful. This commit brought to you by the follow quote: "Chewie, take the professor in the back and plug him into the hyperdrive." committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Wed, 17 Mar 2004 02:25:03 +0000
parents 82e0f87c7698
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2366
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2 Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
3
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
4 This software is provided 'as-is', without any express or implied
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
5 warranty. In no event will the authors be held liable for any damages
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
6 arising from the use of this software.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
7
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
8 Permission is granted to anyone to use this software for any purpose,
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
9 including commercial applications, and to alter it and redistribute it
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
10 freely, subject to the following restrictions:
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
11
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
12 1. The origin of this software must not be misrepresented; you must not
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
13 claim that you wrote the original software. If you use this software
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
14 in a product, an acknowledgment in the product documentation would be
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
15 appreciated but is not required.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
16 2. Altered source versions must be plainly marked as such, and must not be
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
17 misrepresented as being the original software.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
18 3. This notice may not be removed or altered from any source distribution.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
19
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
20 L. Peter Deutsch
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
21 ghost@aladdin.com
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
22
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
23 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
24 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
25 Independent implementation of MD5 (RFC 1321).
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
26
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
27 This code implements the MD5 Algorithm defined in RFC 1321.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
28 It is derived directly from the text of the RFC and not from the
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
29 reference implementation.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
30
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
31 The original and principal author of md5.c is L. Peter Deutsch
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
32 <ghost@aladdin.com>. Other authors are noted in the change history
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
33 that follows (in reverse chronological order):
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
34
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
35 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
36 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
37 1999-05-03 lpd Original version.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
38 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
39
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
40 #include "md5.h"
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
41 #include <string.h>
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
42
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
43 #ifdef TEST
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
44 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
45 * Compile with -DTEST to create a self-contained executable test program.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
46 * The test program should print out the same values as given in section
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
47 * A.5 of RFC 1321, reproduced below.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
48 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
49 #include <string.h>
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
50 main()
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
51 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
52 static const char *const test[7] = {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
53 "", /*d41d8cd98f00b204e9800998ecf8427e*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
54 "945399884.61923487334tuvga", /*0cc175b9c0f1b6a831c399e269772661*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
55 "abc", /*900150983cd24fb0d6963f7d28e17f72*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
56 "message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
57 "abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
58 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
59 /*d174ab98d277d9f5a5611c2c9f419d9f*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
60 "12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
61 };
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
62 int i;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
63
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
64 for (i = 0; i < 7; ++i) {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
65 md5_state_t state;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
66 md5_byte_t digest[16];
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
67 int di;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
68
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
69 md5_init(&state);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
70 md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i]));
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
71 md5_finish(&state, digest);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
72 printf("MD5 (\"%s\") = ", test[i]);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
73 for (di = 0; di < 16; ++di)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
74 printf("%02x", digest[di]);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
75 printf("\n");
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
76 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
77 return 0;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
78 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
79 #endif /* TEST */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
80
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
81
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
82 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
83 * For reference, here is the program that computed the T values.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
84 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
85 #if 0
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
86 #include <math.h>
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
87 main()
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
88 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
89 int i;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
90 for (i = 1; i <= 64; ++i) {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
91 unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
92 printf("#define T%d 0x%08lx\n", i, v);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
93 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
94 return 0;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
95 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
96 #endif
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
97 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
98 * End of T computation program.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
99 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
100 #define T1 0xd76aa478
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
101 #define T2 0xe8c7b756
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
102 #define T3 0x242070db
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
103 #define T4 0xc1bdceee
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
104 #define T5 0xf57c0faf
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
105 #define T6 0x4787c62a
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
106 #define T7 0xa8304613
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
107 #define T8 0xfd469501
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
108 #define T9 0x698098d8
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
109 #define T10 0x8b44f7af
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
110 #define T11 0xffff5bb1
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
111 #define T12 0x895cd7be
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
112 #define T13 0x6b901122
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
113 #define T14 0xfd987193
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
114 #define T15 0xa679438e
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
115 #define T16 0x49b40821
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
116 #define T17 0xf61e2562
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
117 #define T18 0xc040b340
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
118 #define T19 0x265e5a51
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
119 #define T20 0xe9b6c7aa
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
120 #define T21 0xd62f105d
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
121 #define T22 0x02441453
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
122 #define T23 0xd8a1e681
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
123 #define T24 0xe7d3fbc8
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
124 #define T25 0x21e1cde6
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
125 #define T26 0xc33707d6
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
126 #define T27 0xf4d50d87
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
127 #define T28 0x455a14ed
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
128 #define T29 0xa9e3e905
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
129 #define T30 0xfcefa3f8
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
130 #define T31 0x676f02d9
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
131 #define T32 0x8d2a4c8a
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
132 #define T33 0xfffa3942
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
133 #define T34 0x8771f681
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
134 #define T35 0x6d9d6122
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
135 #define T36 0xfde5380c
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
136 #define T37 0xa4beea44
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
137 #define T38 0x4bdecfa9
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
138 #define T39 0xf6bb4b60
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
139 #define T40 0xbebfbc70
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
140 #define T41 0x289b7ec6
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
141 #define T42 0xeaa127fa
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
142 #define T43 0xd4ef3085
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
143 #define T44 0x04881d05
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
144 #define T45 0xd9d4d039
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
145 #define T46 0xe6db99e5
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
146 #define T47 0x1fa27cf8
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
147 #define T48 0xc4ac5665
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
148 #define T49 0xf4292244
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
149 #define T50 0x432aff97
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
150 #define T51 0xab9423a7
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
151 #define T52 0xfc93a039
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
152 #define T53 0x655b59c3
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
153 #define T54 0x8f0ccc92
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
154 #define T55 0xffeff47d
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
155 #define T56 0x85845dd1
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
156 #define T57 0x6fa87e4f
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
157 #define T58 0xfe2ce6e0
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
158 #define T59 0xa3014314
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
159 #define T60 0x4e0811a1
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
160 #define T61 0xf7537e82
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
161 #define T62 0xbd3af235
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
162 #define T63 0x2ad7d2bb
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
163 #define T64 0xeb86d391
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
164
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
165 static void
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
166 md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
167 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
168 md5_word_t
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
169 a = pms->abcd[0], b = pms->abcd[1],
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
170 c = pms->abcd[2], d = pms->abcd[3];
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
171 md5_word_t t;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
172
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
173 #ifndef ARCH_IS_BIG_ENDIAN
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
174 # define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
175 #endif
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
176 #if ARCH_IS_BIG_ENDIAN
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
177
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
178 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
179 * On big-endian machines, we must arrange the bytes in the right
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
180 * order. (This also works on machines of unknown byte order.)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
181 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
182 md5_word_t X[16];
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
183 const md5_byte_t *xp = data;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
184 int i;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
185
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
186 for (i = 0; i < 16; ++i, xp += 4)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
187 X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
188
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
189 #else /* !ARCH_IS_BIG_ENDIAN */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
190
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
191 /*
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
192 * On little-endian machines, we can process properly aligned data
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
193 * without copying it.
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
194 */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
195 md5_word_t xbuf[16];
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
196 const md5_word_t *X;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
197
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
198 if (!((data - (const md5_byte_t *)0) & 3)) {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
199 /* data are properly aligned */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
200 X = (const md5_word_t *)data;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
201 } else {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
202 /* not aligned */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
203 memcpy(xbuf, data, 64);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
204 X = xbuf;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
205 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
206 #endif
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
207
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
208 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
209
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
210 /* Round 1. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
211 /* Let [abcd k s i] denote the operation
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
212 a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
213 #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
214 #define SET(a, b, c, d, k, s, Ti)\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
215 t = a + F(b,c,d) + X[k] + Ti;\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
216 a = ROTATE_LEFT(t, s) + b
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
217 /* Do the following 16 operations. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
218 SET(a, b, c, d, 0, 7, T1);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
219 SET(d, a, b, c, 1, 12, T2);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
220 SET(c, d, a, b, 2, 17, T3);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
221 SET(b, c, d, a, 3, 22, T4);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
222 SET(a, b, c, d, 4, 7, T5);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
223 SET(d, a, b, c, 5, 12, T6);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
224 SET(c, d, a, b, 6, 17, T7);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
225 SET(b, c, d, a, 7, 22, T8);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
226 SET(a, b, c, d, 8, 7, T9);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
227 SET(d, a, b, c, 9, 12, T10);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
228 SET(c, d, a, b, 10, 17, T11);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
229 SET(b, c, d, a, 11, 22, T12);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
230 SET(a, b, c, d, 12, 7, T13);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
231 SET(d, a, b, c, 13, 12, T14);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
232 SET(c, d, a, b, 14, 17, T15);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
233 SET(b, c, d, a, 15, 22, T16);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
234 #undef SET
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
235
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
236 /* Round 2. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
237 /* Let [abcd k s i] denote the operation
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
238 a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
239 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
240 #define SET(a, b, c, d, k, s, Ti)\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
241 t = a + G(b,c,d) + X[k] + Ti;\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
242 a = ROTATE_LEFT(t, s) + b
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
243 /* Do the following 16 operations. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
244 SET(a, b, c, d, 1, 5, T17);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
245 SET(d, a, b, c, 6, 9, T18);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
246 SET(c, d, a, b, 11, 14, T19);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
247 SET(b, c, d, a, 0, 20, T20);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
248 SET(a, b, c, d, 5, 5, T21);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
249 SET(d, a, b, c, 10, 9, T22);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
250 SET(c, d, a, b, 15, 14, T23);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
251 SET(b, c, d, a, 4, 20, T24);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
252 SET(a, b, c, d, 9, 5, T25);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
253 SET(d, a, b, c, 14, 9, T26);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
254 SET(c, d, a, b, 3, 14, T27);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
255 SET(b, c, d, a, 8, 20, T28);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
256 SET(a, b, c, d, 13, 5, T29);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
257 SET(d, a, b, c, 2, 9, T30);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
258 SET(c, d, a, b, 7, 14, T31);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
259 SET(b, c, d, a, 12, 20, T32);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
260 #undef SET
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
261
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
262 /* Round 3. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
263 /* Let [abcd k s t] denote the operation
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
264 a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
265 #define H(x, y, z) ((x) ^ (y) ^ (z))
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
266 #define SET(a, b, c, d, k, s, Ti)\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
267 t = a + H(b,c,d) + X[k] + Ti;\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
268 a = ROTATE_LEFT(t, s) + b
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
269 /* Do the following 16 operations. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
270 SET(a, b, c, d, 5, 4, T33);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
271 SET(d, a, b, c, 8, 11, T34);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
272 SET(c, d, a, b, 11, 16, T35);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
273 SET(b, c, d, a, 14, 23, T36);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
274 SET(a, b, c, d, 1, 4, T37);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
275 SET(d, a, b, c, 4, 11, T38);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
276 SET(c, d, a, b, 7, 16, T39);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
277 SET(b, c, d, a, 10, 23, T40);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
278 SET(a, b, c, d, 13, 4, T41);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
279 SET(d, a, b, c, 0, 11, T42);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
280 SET(c, d, a, b, 3, 16, T43);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
281 SET(b, c, d, a, 6, 23, T44);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
282 SET(a, b, c, d, 9, 4, T45);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
283 SET(d, a, b, c, 12, 11, T46);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
284 SET(c, d, a, b, 15, 16, T47);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
285 SET(b, c, d, a, 2, 23, T48);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
286 #undef SET
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
287
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
288 /* Round 4. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
289 /* Let [abcd k s t] denote the operation
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
290 a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
291 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
292 #define SET(a, b, c, d, k, s, Ti)\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
293 t = a + I(b,c,d) + X[k] + Ti;\
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
294 a = ROTATE_LEFT(t, s) + b
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
295 /* Do the following 16 operations. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
296 SET(a, b, c, d, 0, 6, T49);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
297 SET(d, a, b, c, 7, 10, T50);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
298 SET(c, d, a, b, 14, 15, T51);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
299 SET(b, c, d, a, 5, 21, T52);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
300 SET(a, b, c, d, 12, 6, T53);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
301 SET(d, a, b, c, 3, 10, T54);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
302 SET(c, d, a, b, 10, 15, T55);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
303 SET(b, c, d, a, 1, 21, T56);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
304 SET(a, b, c, d, 8, 6, T57);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
305 SET(d, a, b, c, 15, 10, T58);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
306 SET(c, d, a, b, 6, 15, T59);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
307 SET(b, c, d, a, 13, 21, T60);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
308 SET(a, b, c, d, 4, 6, T61);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
309 SET(d, a, b, c, 11, 10, T62);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
310 SET(c, d, a, b, 2, 15, T63);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
311 SET(b, c, d, a, 9, 21, T64);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
312 #undef SET
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
313
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
314 /* Then perform the following additions. (That is increment each
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
315 of the four registers by the value it had before this block
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
316 was started.) */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
317 pms->abcd[0] += a;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
318 pms->abcd[1] += b;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
319 pms->abcd[2] += c;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
320 pms->abcd[3] += d;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
321 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
322
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
323 void
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
324 md5_init(md5_state_t *pms)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
325 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
326 pms->count[0] = pms->count[1] = 0;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
327 pms->abcd[0] = 0x67452301;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
328 pms->abcd[1] = 0xefcdab89;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
329 pms->abcd[2] = 0x98badcfe;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
330 pms->abcd[3] = 0x10325476;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
331 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
332
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
333 void
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
334 md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
335 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
336 const md5_byte_t *p = data;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
337 int left = nbytes;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
338 int offset = (pms->count[0] >> 3) & 63;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
339 md5_word_t nbits = (md5_word_t)(nbytes << 3);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
340
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
341 if (nbytes <= 0)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
342 return;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
343
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
344 /* Update the message length. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
345 pms->count[1] += nbytes >> 29;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
346 pms->count[0] += nbits;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
347 if (pms->count[0] < nbits)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
348 pms->count[1]++;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
349
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
350 /* Process an initial partial block. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
351 if (offset) {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
352 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
353
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
354 memcpy(pms->buf + offset, p, copy);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
355 if (offset + copy < 64)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
356 return;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
357 p += copy;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
358 left -= copy;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
359 md5_process(pms, pms->buf);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
360 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
361
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
362 /* Process full blocks. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
363 for (; left >= 64; p += 64, left -= 64)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
364 md5_process(pms, p);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
365
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
366 /* Process a final partial block. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
367 if (left)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
368 memcpy(pms->buf, p, left);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
369 }
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
370
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
371 void
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
372 md5_finish(md5_state_t *pms, md5_byte_t digest[16])
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
373 {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
374 static const md5_byte_t pad[64] = {
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
375 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
376 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
377 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
379 };
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
380 md5_byte_t data[8];
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
381 int i;
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
382
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
383 /* Save the length before padding. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
384 for (i = 0; i < 8; ++i)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
385 data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
386 /* Pad to 56 bytes mod 64. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
387 md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
388 /* Append the length. */
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
389 md5_append(pms, data, 8);
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
390 for (i = 0; i < 16; ++i)
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
391 digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
82e0f87c7698 [gaim-migrate @ 2379]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
392 }