yann@1
|
1 |
--- glibc-2.1.3/md5-crypt/md5-crypt.c 2000/03/04 00:47:30 1.1
|
yann@1
|
2 |
+++ glibc-2.1.3/md5-crypt/md5-crypt.c 2000/08/24 06:10:02 1.8
|
yann@1
|
3 |
@@ -1,5 +1,5 @@
|
yann@1
|
4 |
/* One way encryption based on MD5 sum.
|
yann@1
|
5 |
- Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
|
yann@1
|
6 |
+ Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
|
yann@1
|
7 |
This file is part of the GNU C Library.
|
yann@1
|
8 |
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
yann@1
|
9 |
|
yann@1
|
10 |
@@ -18,6 +18,7 @@
|
yann@1
|
11 |
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
yann@1
|
12 |
Boston, MA 02111-1307, USA. */
|
yann@1
|
13 |
|
yann@1
|
14 |
+#include <assert.h>
|
yann@1
|
15 |
#include <errno.h>
|
yann@1
|
16 |
#include <stdlib.h>
|
yann@1
|
17 |
#include <string.h>
|
yann@1
|
18 |
@@ -37,9 +38,9 @@
|
yann@1
|
19 |
|
yann@1
|
20 |
|
yann@1
|
21 |
/* Prototypes for local functions. */
|
yann@1
|
22 |
-extern char *__md5_crypt_r __P ((const char *key, const char *salt,
|
yann@1
|
23 |
- char *buffer, int buflen));
|
yann@1
|
24 |
-extern char *__md5_crypt __P ((const char *key, const char *salt));
|
yann@1
|
25 |
+extern char *__md5_crypt_r (const char *key, const char *salt,
|
yann@1
|
26 |
+ char *buffer, int buflen);
|
yann@1
|
27 |
+extern char *__md5_crypt (const char *key, const char *salt);
|
yann@1
|
28 |
|
yann@1
|
29 |
|
yann@1
|
30 |
/* This entry point is equivalent to the `crypt' function in Unix
|
yann@1
|
31 |
@@ -51,13 +52,16 @@
|
yann@1
|
32 |
char *buffer;
|
yann@1
|
33 |
int buflen;
|
yann@1
|
34 |
{
|
yann@1
|
35 |
- unsigned char alt_result[16];
|
yann@1
|
36 |
+ unsigned char alt_result[16]
|
yann@1
|
37 |
+ __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
|
yann@1
|
38 |
struct md5_ctx ctx;
|
yann@1
|
39 |
struct md5_ctx alt_ctx;
|
yann@1
|
40 |
size_t salt_len;
|
yann@1
|
41 |
size_t key_len;
|
yann@1
|
42 |
size_t cnt;
|
yann@1
|
43 |
char *cp;
|
yann@1
|
44 |
+ char *copied_key = NULL;
|
yann@1
|
45 |
+ char *copied_salt = NULL;
|
yann@1
|
46 |
|
yann@1
|
47 |
/* Find beginning of salt string. The prefix should normally always
|
yann@1
|
48 |
be present. Just in case it is not. */
|
yann@1
|
49 |
@@ -68,6 +72,26 @@
|
yann@1
|
50 |
salt_len = MIN (strcspn (salt, "$"), 8);
|
yann@1
|
51 |
key_len = strlen (key);
|
yann@1
|
52 |
|
yann@1
|
53 |
+ if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0)
|
yann@1
|
54 |
+ {
|
yann@1
|
55 |
+ char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32));
|
yann@1
|
56 |
+ key = copied_key =
|
yann@1
|
57 |
+ memcpy (tmp + __alignof__ (md5_uint32)
|
yann@1
|
58 |
+ - (tmp - (char *) 0) % __alignof__ (md5_uint32),
|
yann@1
|
59 |
+ key, key_len);
|
yann@1
|
60 |
+ assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0);
|
yann@1
|
61 |
+ }
|
yann@1
|
62 |
+
|
yann@1
|
63 |
+ if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0)
|
yann@1
|
64 |
+ {
|
yann@1
|
65 |
+ char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32));
|
yann@1
|
66 |
+ salt = copied_salt =
|
yann@1
|
67 |
+ memcpy (tmp + __alignof__ (md5_uint32)
|
yann@1
|
68 |
+ - (tmp - (char *) 0) % __alignof__ (md5_uint32),
|
yann@1
|
69 |
+ salt, salt_len);
|
yann@1
|
70 |
+ assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0);
|
yann@1
|
71 |
+ }
|
yann@1
|
72 |
+
|
yann@1
|
73 |
/* Prepare for the real work. */
|
yann@1
|
74 |
__md5_init_ctx (&ctx);
|
yann@1
|
75 |
|
yann@1
|
76 |
@@ -195,21 +219,30 @@
|
yann@1
|
77 |
|
yann@1
|
78 |
/* Clear the buffer for the intermediate result so that people
|
yann@1
|
79 |
attaching to processes or reading core dumps cannot get any
|
yann@1
|
80 |
- information. */
|
yann@1
|
81 |
- memset (alt_result, '\0', sizeof (alt_result));
|
yann@1
|
82 |
+ information. We do it in this way to clear correct_words[]
|
yann@1
|
83 |
+ inside the MD5 implementation as well. */
|
yann@1
|
84 |
+ __md5_init_ctx (&ctx);
|
yann@1
|
85 |
+ __md5_finish_ctx (&ctx, alt_result);
|
yann@1
|
86 |
+ memset (&ctx, '\0', sizeof (ctx));
|
yann@1
|
87 |
+ memset (&alt_ctx, '\0', sizeof (alt_ctx));
|
yann@1
|
88 |
+ if (copied_key != NULL)
|
yann@1
|
89 |
+ memset (copied_key, '\0', key_len);
|
yann@1
|
90 |
+ if (copied_salt != NULL)
|
yann@1
|
91 |
+ memset (copied_salt, '\0', salt_len);
|
yann@1
|
92 |
|
yann@1
|
93 |
return buffer;
|
yann@1
|
94 |
}
|
yann@1
|
95 |
|
yann@1
|
96 |
|
yann@1
|
97 |
+static char *buffer;
|
yann@1
|
98 |
+
|
yann@1
|
99 |
char *
|
yann@1
|
100 |
__md5_crypt (const char *key, const char *salt)
|
yann@1
|
101 |
{
|
yann@1
|
102 |
/* We don't want to have an arbitrary limit in the size of the
|
yann@1
|
103 |
password. We can compute the size of the result in advance and
|
yann@1
|
104 |
so we can prepare the buffer we pass to `md5_crypt_r'. */
|
yann@1
|
105 |
- static char *buffer = NULL;
|
yann@1
|
106 |
- static int buflen = 0;
|
yann@1
|
107 |
+ static int buflen;
|
yann@1
|
108 |
int needed = 3 + strlen (salt) + 1 + 26 + 1;
|
yann@1
|
109 |
|
yann@1
|
110 |
if (buflen < needed)
|
yann@1
|
111 |
@@ -220,4 +253,12 @@
|
yann@1
|
112 |
}
|
yann@1
|
113 |
|
yann@1
|
114 |
return __md5_crypt_r (key, salt, buffer, buflen);
|
yann@1
|
115 |
+}
|
yann@1
|
116 |
+
|
yann@1
|
117 |
+
|
yann@1
|
118 |
+static void
|
yann@1
|
119 |
+__attribute__ ((__destructor__))
|
yann@1
|
120 |
+free_mem (void)
|
yann@1
|
121 |
+{
|
yann@1
|
122 |
+ free (buffer);
|
yann@1
|
123 |
}
|
yann@1
|
124 |
--- glibc-2.1.3/md5-crypt/md5.c 2000/03/04 00:47:30 1.1
|
yann@1
|
125 |
+++ glibc-2.1.3/md5-crypt/md5.c 2000/07/04 18:22:44 1.2
|
yann@1
|
126 |
@@ -1,6 +1,6 @@
|
yann@1
|
127 |
-/* md5.c - Functions to compute MD5 message digest of files or memory blocks
|
yann@1
|
128 |
+/* Functions to compute MD5 message digest of files or memory blocks.
|
yann@1
|
129 |
according to the definition of MD5 in RFC 1321 from April 1992.
|
yann@1
|
130 |
- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
|
yann@1
|
131 |
+ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
|
yann@1
|
132 |
This file is part of the GNU C Library.
|
yann@1
|
133 |
|
yann@1
|
134 |
The GNU C Library is free software; you can redistribute it and/or
|
yann@1
|
135 |
@@ -217,6 +217,8 @@
|
yann@1
|
136 |
size_t len;
|
yann@1
|
137 |
struct md5_ctx *ctx;
|
yann@1
|
138 |
{
|
yann@1
|
139 |
+ //const void aligned_buffer = buffer;
|
yann@1
|
140 |
+
|
yann@1
|
141 |
/* When we already have some bits in our internal buffer concatenate
|
yann@1
|
142 |
both inputs first. */
|
yann@1
|
143 |
if (ctx->buflen != 0)
|
yann@1
|
144 |
@@ -224,16 +226,20 @@
|
yann@1
|
145 |
size_t left_over = ctx->buflen;
|
yann@1
|
146 |
size_t add = 128 - left_over > len ? len : 128 - left_over;
|
yann@1
|
147 |
|
yann@1
|
148 |
+ /* Only put full words in the buffer. */
|
yann@1
|
149 |
+ add -= add % __alignof__ (md5_uint32);
|
yann@1
|
150 |
+
|
yann@1
|
151 |
memcpy (&ctx->buffer[left_over], buffer, add);
|
yann@1
|
152 |
ctx->buflen += add;
|
yann@1
|
153 |
|
yann@1
|
154 |
- if (left_over + add > 64)
|
yann@1
|
155 |
+ if (ctx->buflen > 64)
|
yann@1
|
156 |
{
|
yann@1
|
157 |
- md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
|
yann@1
|
158 |
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
|
yann@1
|
159 |
+
|
yann@1
|
160 |
+ ctx->buflen &= 63;
|
yann@1
|
161 |
/* The regions in the following copy operation cannot overlap. */
|
yann@1
|
162 |
memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
|
yann@1
|
163 |
- (left_over + add) & 63);
|
yann@1
|
164 |
- ctx->buflen = (left_over + add) & 63;
|
yann@1
|
165 |
+ ctx->buflen);
|
yann@1
|
166 |
}
|
yann@1
|
167 |
|
yann@1
|
168 |
buffer = (const char *) buffer + add;
|
yann@1
|
169 |
@@ -251,8 +257,17 @@
|
yann@1
|
170 |
/* Move remaining bytes in internal buffer. */
|
yann@1
|
171 |
if (len > 0)
|
yann@1
|
172 |
{
|
yann@1
|
173 |
- memcpy (ctx->buffer, buffer, len);
|
yann@1
|
174 |
- ctx->buflen = len;
|
yann@1
|
175 |
+ size_t left_over = ctx->buflen;
|
yann@1
|
176 |
+
|
yann@1
|
177 |
+ memcpy (&ctx->buffer[left_over], buffer, len);
|
yann@1
|
178 |
+ left_over += len;
|
yann@1
|
179 |
+ if (left_over >= 64)
|
yann@1
|
180 |
+ {
|
yann@1
|
181 |
+ md5_process_block (ctx->buffer, 64, ctx);
|
yann@1
|
182 |
+ left_over -= 64;
|
yann@1
|
183 |
+ memcpy (ctx->buffer, &ctx->buffer[64], left_over);
|
yann@1
|
184 |
+ }
|
yann@1
|
185 |
+ ctx->buflen = left_over;
|
yann@1
|
186 |
}
|
yann@1
|
187 |
}
|
yann@1
|
188 |
|
yann@1
|
189 |
--- glibc-2.1.3/md5-crypt/md5.h 2000/03/04 00:47:30 1.1
|
yann@1
|
190 |
+++ glibc-2.1.3/md5-crypt/md5.h 2000/07/04 18:22:44 1.2
|
yann@1
|
191 |
@@ -1,6 +1,6 @@
|
yann@1
|
192 |
/* Declaration of functions and data types used for MD5 sum computing
|
yann@1
|
193 |
library functions.
|
yann@1
|
194 |
- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
|
yann@1
|
195 |
+ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
|
yann@1
|
196 |
This file is part of the GNU C Library.
|
yann@1
|
197 |
|
yann@1
|
198 |
The GNU C Library is free software; you can redistribute it and/or
|
yann@1
|
199 |
@@ -87,7 +87,7 @@
|
yann@1
|
200 |
|
yann@1
|
201 |
md5_uint32 total[2];
|
yann@1
|
202 |
md5_uint32 buflen;
|
yann@1
|
203 |
- char buffer[128];
|
yann@1
|
204 |
+ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
|
yann@1
|
205 |
};
|
yann@1
|
206 |
|
yann@1
|
207 |
/*
|