annotate mcabber/connwrap/md5.c @ 830:80434fde7cfa

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