annotate src/md5.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents fdefd0186b75
children a5954632b187
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* md5.c - Functions to compute MD5 message digest of files or memory blocks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 according to the definition of MD5 in RFC 1321 from April 1992.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995, 1996 Free Software Foundation, Inc.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
4 Copyright (C) 2001 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 NOTE: The canonical source of this file is maintained with the GNU C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with this program; if not, write to the Free Software Foundation,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* XEmacs frontend written by Ben Wing, Jareth Hein and Hrvoje Niksic. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 # include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include <stdio.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
33 #include <limits.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 /* The following contortions are an attempt to use the C preprocessor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 to determine an unsigned integral type that is 32 bits wide. An
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 doing that would require that the configure script compile and *run*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 the resulting executable. Locally running cross-compiled executables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 is usually not possible. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #ifdef _LIBC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 # include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 typedef u_int32_t md5_uint32;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 # if defined __STDC__ && __STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 # define UINT_MAX_32_BITS 4294967295U
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 # define UINT_MAX_32_BITS 0xFFFFFFFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* If UINT_MAX isn't defined, assume it's a 32-bit type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 This should be valid for all systems GNU cares about because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 that doesn't include 16-bit systems, and only modern systems
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 (that certainly have <limits.h>) have 64+-bit integral types. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 # ifndef UINT_MAX
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 # define UINT_MAX UINT_MAX_32_BITS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 # if UINT_MAX == UINT_MAX_32_BITS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 typedef unsigned int md5_uint32;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 # if USHRT_MAX == UINT_MAX_32_BITS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 typedef unsigned short md5_uint32;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 # if ULONG_MAX == UINT_MAX_32_BITS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 typedef unsigned long md5_uint32;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 # else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 /* The following line is intended to evoke an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 Using #error is not portable enough. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 "Cannot determine unsigned 32-bit data type."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 # endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #include "lstream.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 # include "file-coding.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 /* Structure to save state of computation between the single steps. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 struct md5_ctx
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 md5_uint32 A;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 md5_uint32 B;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 md5_uint32 C;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 md5_uint32 D;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 md5_uint32 total[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 md5_uint32 buflen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 char buffer[128];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 #ifdef WORDS_BIGENDIAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 # define SWAP(n) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 # define SWAP(n) (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 /* This array contains the bytes used to pad the buffer to the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 64-byte boundary. (RFC 1321, 3.1: Step 1) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
109 static void md5_process_block (const void *, size_t, struct md5_ctx *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 /* Initialize structure containing state of computation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 (RFC 1321, 3.3: Step 3) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 md5_init_ctx (struct md5_ctx *ctx)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 ctx->A = 0x67452301;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 ctx->B = 0xefcdab89;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 ctx->C = 0x98badcfe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 ctx->D = 0x10325476;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 ctx->total[0] = ctx->total[1] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 ctx->buflen = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 /* Put result from CTX in first 16 bytes following RESBUF. The result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 must be in little endian byte order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 IMPORTANT: On some systems it is required that RESBUF is correctly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 aligned for a 32 bits value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 static void *
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
132 md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 return resbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 /* Process the remaining bytes in the internal buffer and the usual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 prolog according to the standard and write the result to RESBUF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 IMPORTANT: On some systems it is required that RESBUF is correctly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 aligned for a 32 bits value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 static void *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 /* Take yet unprocessed bytes into account. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 md5_uint32 bytes = ctx->buflen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 size_t pad;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 /* Now count remaining bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 ctx->total[0] += bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 if (ctx->total[0] < bytes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 ++ctx->total[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 memcpy (&ctx->buffer[bytes], fillbuf, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* Put the 64-bit file length in *bits* at the end of the buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 (ctx->total[0] >> 29));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 /* Process last bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 return md5_read_ctx (ctx, resbuf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 #ifndef emacs /* unused in Emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 /* Compute MD5 message digest for bytes read from STREAM. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 resulting message digest number will be written into the 16 bytes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 beginning at RESBLOCK. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 md5_stream (FILE *stream, void *resblock)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 /* Important: BLOCKSIZE must be a multiple of 64. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 #define BLOCKSIZE 4096
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 struct md5_ctx ctx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 char buffer[BLOCKSIZE + 72];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 size_t sum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 /* Initialize the computation context. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 md5_init_ctx (&ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 /* Iterate over full file contents. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 computation function processes the whole buffer so that with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 next round of the loop another block can be read. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 size_t n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 sum = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 /* Read block. Take care for partial reads. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
201 n = retry_fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 sum += n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 while (sum < BLOCKSIZE && n != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 if (n == 0 && ferror (stream))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 /* If end of file is reached, end the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 if (n == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* Process buffer with BLOCKSIZE bytes. Note that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 BLOCKSIZE % 64 == 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 md5_process_block (buffer, BLOCKSIZE, &ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 /* Add the last bytes if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 if (sum > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 md5_process_bytes (buffer, sum, &ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 /* Construct result in desired memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 md5_finish_ctx (&ctx, resblock);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 result is always in little endian byte order, so that a byte-wise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 output yields to the wanted ASCII representation of the message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 digest. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 void *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 md5_buffer (const char *buffer, size_t len, void *resblock)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 struct md5_ctx ctx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 /* Initialize the computation context. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 md5_init_ctx (&ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 /* Process whole buffer but last len % 64 bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 md5_process_bytes (buffer, len, &ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 /* Put result in desired memory area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 return md5_finish_ctx (&ctx, resblock);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 #endif /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
250 md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 /* When we already have some bits in our internal buffer concatenate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 both inputs first. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 if (ctx->buflen != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 size_t left_over = ctx->buflen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 size_t add = 128 - left_over > len ? len : 128 - left_over;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 memcpy (&ctx->buffer[left_over], buffer, add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ctx->buflen += add;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 if (left_over + add > 64)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 /* The regions in the following copy operation cannot overlap. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (left_over + add) & 63);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 ctx->buflen = (left_over + add) & 63;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 buffer = (const char *) buffer + add;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 len -= add;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 /* Process available complete blocks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 if (len > 64)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 md5_process_block (buffer, len & ~63, ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 buffer = (const char *) buffer + (len & ~63);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 len &= 63;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 /* Move remaining bytes in internal buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 if (len > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 memcpy (ctx->buffer, buffer, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 ctx->buflen = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 /* These are the four functions used in the four steps of the MD5 algorithm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 and defined in the RFC 1321. The first function is a little bit optimized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (as found in Colin Plumbs public domain implementation). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 /* #define FF(b, c, d) ((b & c) | (~b & d)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 #define FF(b, c, d) (d ^ (b & (c ^ d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 #define FG(b, c, d) FF (d, b, c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 #define FH(b, c, d) (b ^ c ^ d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 #define FI(b, c, d) (c ^ (b | ~d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 /* Process LEN bytes of BUFFER, accumulating context into CTX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 It is assumed that LEN % 64 == 0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
305 md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 md5_uint32 correct_words[16];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 const md5_uint32 *words = (const md5_uint32 *) buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 size_t nwords = len / sizeof (md5_uint32);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 const md5_uint32 *endp = words + nwords;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 md5_uint32 A = ctx->A;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 md5_uint32 B = ctx->B;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 md5_uint32 C = ctx->C;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 md5_uint32 D = ctx->D;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 /* First increment the byte count. RFC 1321 specifies the possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 length of the file up to 2^64 bits. Here we only compute the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 number of bytes. Do a double word increment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 ctx->total[0] += len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 if (ctx->total[0] < len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 ++ctx->total[1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /* Process all bytes in the buffer with 64 bytes in each round of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 while (words < endp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 md5_uint32 *cwp = correct_words;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 md5_uint32 A_save = A;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 md5_uint32 B_save = B;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 md5_uint32 C_save = C;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 md5_uint32 D_save = D;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 /* First round: using the given function, the context and a constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 the next context is computed. Because the algorithms processing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 unit is a 32-bit word and it is determined to work on words in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 little endian byte order we perhaps have to change the byte order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 before the computation. To reduce the work for the next steps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 we store the swapped words in the array CORRECT_WORDS. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 #define OP(a, b, c, d, s, T) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 ++words; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 CYCLIC (a, s); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 a += b; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 /* It is unfortunate that C does not provide an operator for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 cyclic rotation. Hope the C compiler is smart enough. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 /* Before we start, one word to the strange constants.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 They are defined in RFC 1321 as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 /* Round 1. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 OP (A, B, C, D, 7, 0xd76aa478);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 OP (D, A, B, C, 12, 0xe8c7b756);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 OP (C, D, A, B, 17, 0x242070db);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 OP (B, C, D, A, 22, 0xc1bdceee);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 OP (A, B, C, D, 7, 0xf57c0faf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 OP (D, A, B, C, 12, 0x4787c62a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 OP (C, D, A, B, 17, 0xa8304613);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 OP (B, C, D, A, 22, 0xfd469501);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 OP (A, B, C, D, 7, 0x698098d8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 OP (D, A, B, C, 12, 0x8b44f7af);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 OP (C, D, A, B, 17, 0xffff5bb1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 OP (B, C, D, A, 22, 0x895cd7be);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 OP (A, B, C, D, 7, 0x6b901122);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 OP (D, A, B, C, 12, 0xfd987193);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 OP (C, D, A, B, 17, 0xa679438e);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 OP (B, C, D, A, 22, 0x49b40821);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 /* For the second to fourth round we have the possibly swapped words
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 in CORRECT_WORDS. Redefine the macro to take an additional first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 argument specifying the function to use. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 #undef OP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 #define OP(f, a, b, c, d, k, s, T) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 a += f (b, c, d) + correct_words[k] + T; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 CYCLIC (a, s); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 a += b; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 /* Round 2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 OP (FG, D, A, B, C, 6, 9, 0xc040b340);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 OP (FG, D, A, B, C, 10, 9, 0x02441453);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 /* Round 3. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 OP (FH, D, A, B, C, 8, 11, 0x8771f681);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 OP (FH, B, C, D, A, 6, 23, 0x04881d05);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 /* Round 4. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 OP (FI, A, B, C, D, 0, 6, 0xf4292244);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 OP (FI, D, A, B, C, 7, 10, 0x432aff97);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 OP (FI, C, D, A, B, 6, 15, 0xa3014314);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* Add the starting values of the context. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 A += A_save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 B += B_save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 C += C_save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 D += D_save;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 /* Put checksum in context given as argument. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 ctx->A = A;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 ctx->B = B;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 ctx->C = C;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 ctx->D = D;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 /* Find out what format the buffer will be saved in, so we can make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 the digest based on what it will look like on disk. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 md5_coding_system (Lisp_Object object, Lisp_Object coding, Lisp_Object istream,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 int error_me_not)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 Lisp_Object coding_system;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 if (NILP (coding))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 if (BUFFERP (object))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
472 /* Use the file coding for this buffer by default. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
473 coding = XBUFFER (object)->buffer_file_coding_system;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
475 /* Attempt to autodetect the coding of the string. This is
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
476 VERY hit-and-miss. #### It shouldn't be. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
477 coding = detect_coding_stream (istream);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
478 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
479
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
480 if (error_me_not)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
481 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
482 coding_system = find_coding_system_for_text_file (coding, 0);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
483 if (NILP (coding_system))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
484 /* Default to binary. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 coding_system = Fget_coding_system (Qbinary);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
488 coding_system = get_coding_system_for_text_file (coding, 0);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
489
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 return coding_system;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 DEFUN ("md5", Fmd5, 1, 5, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 Return the MD5 message digest of OBJECT, a buffer or string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 Optional arguments START and END denote positions for computing the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 digest of a portion of OBJECT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 The optional CODING argument specifies the coding system the text is to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 represented in while computing the digest. If unspecified, it defaults
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 to the current format of the data, or is guessed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 If NOERROR is non-nil, silently assume binary coding if the guesswork
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 fails. Normally, an error is signaled in such case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 CODING and NOERROR arguments are meaningful only in XEmacsen with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 file-coding or Mule support. Otherwise, they are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 (object, start, end, coding, noerror))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 /* Can this really GC? How? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 struct md5_ctx ctx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 unsigned char digest[16];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 unsigned char thehash[33];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 Lisp_Object instream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 Lisp_Object raw_instream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 struct gcpro ngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 /* Set up the input stream. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 if (BUFFERP (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 struct buffer *b;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
527 Charbpos begv, endv;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 CHECK_LIVE_BUFFER (object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 b = XBUFFER (object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 /* Figure out where we need to get info from */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 get_buffer_range_char (b, start, end, &begv, &endv, GB_ALLOW_NIL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 instream = make_lisp_buffer_input_stream (b, begv, endv, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 Bytecount bstart, bend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 CHECK_STRING (object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 get_string_range_byte (object, start, end, &bstart, &bend,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 GB_HISTORICAL_STRING_BEHAVIOR);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 instream = make_lisp_string_input_stream (object, bstart, bend - bstart);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 GCPRO1 (instream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 /* Determine the coding and set up the conversion stream. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 coding = md5_coding_system (object, coding, instream, !NILP (noerror));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 raw_instream = instream;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
548 instream = make_coding_input_stream (XLSTREAM (instream), coding, CODING_ENCODE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 NGCPRO1 (raw_instream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 /* Initialize MD5 context. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 md5_init_ctx (&ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 /* Get the data while doing the conversion. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
557 Intbyte tempbuf[1024]; /* some random amount */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
558 Bytecount size_in_bytes =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 Lstream_read (XLSTREAM (instream), tempbuf, sizeof (tempbuf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 if (!size_in_bytes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 /* Process the bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 md5_process_bytes (tempbuf, size_in_bytes, &ctx);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 Lstream_delete (XLSTREAM (instream));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 Lstream_delete (XLSTREAM (raw_instream));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 md5_finish_ctx (&ctx, digest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 for (i = 0; i < 16; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 sprintf ((char *) (thehash + (i * 2)), "%02x", digest[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 return make_string (thehash, 32);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 syms_of_md5 (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 DEFSUBR (Fmd5);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 vars_of_md5 (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 Fprovide (intern ("md5"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 #endif /* emacs */