annotate lib/md2.c @ 12198:e8fbc5424b99

digests, copy-file: increase the IO buffer size from 4KiB to 32KiB This results in a significant decrease in syscall overhead giving a 3% speedup to the digest utilities for example (when processing large files from cache). Storage is moved from the stack to the heap as some threaded environments for example can have small stacks. * lib/copy-file.c (copy_file_preserving): Use a 32KiB malloced buffer * modules/copy-file: Depend on xalloc * lib/md2.c: Likewise * lib/md4.c: Likewise * lib/md5.c: Likewise * lib/sha1.c: Likewise * lib/sha256.c: Likewise * lib/sha512.c: Likewise
author Pádraig Brady <P@draigBrady.com>
date Thu, 22 Oct 2009 17:36:28 +0100
parents 5680cf5b5595
children e8d2c6fc33ad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
1 /* Functions to compute MD2 message digest of files or memory blocks.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
2 according to the definition of MD2 in RFC 1319 from April 1992.
9659
5680cf5b5595 md2: clarify comments to say that alignment is not required.
Simon Josefsson <simon@josefsson.org>
parents: 7584
diff changeset
3 Copyright (C) 1995,1996,1997,1999,2000,2001,2002,2003,2005,2006,2008
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
4 Free Software Foundation, Inc.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
5
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
6 This program is free software; you can redistribute it and/or modify it
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
9 later version.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
10
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
14 GNU General Public License for more details.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
15
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
17 along with this program; if not, write to the Free Software Foundation,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
19
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
20 /* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
21 Tom St Denis. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
22
7584
a88f85e4728f * lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents: 6431
diff changeset
23 #include <config.h>
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
24
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
25 #include "md2.h"
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
26
12198
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
27 #include <stdlib.h>
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
28 #include <string.h>
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
29 #include <sys/types.h>
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
30
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
31 #include <minmax.h>
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
32
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
33 #if USE_UNLOCKED_IO
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
34 # include "unlocked-io.h"
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
35 #endif
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
36
12198
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
37 #define BLOCKSIZE 32768
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
38 #if BLOCKSIZE % 64 != 0
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
39 # error "invalid BLOCKSIZE"
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
40 #endif
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
41
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
42 static void md2_update_chksum (struct md2_ctx *md);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
43 static void md2_compress (struct md2_ctx *md);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
44
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
45 /* Initialize structure containing state of computation.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
46 (RFC 1319, 3.3: Step 3) */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
47 void
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
48 md2_init_ctx (struct md2_ctx *ctx)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
49 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
50 memset (ctx->X, 0, sizeof (ctx->X));
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
51 memset (ctx->chksum, 0, sizeof (ctx->chksum));
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
52 memset (ctx->buf, 0, sizeof (ctx->buf));
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
53 ctx->curlen = 0;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
54 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
55
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
56 /* Put result from CTX in first 16 bytes following RESBUF. The result
9659
5680cf5b5595 md2: clarify comments to say that alignment is not required.
Simon Josefsson <simon@josefsson.org>
parents: 7584
diff changeset
57 must be in little endian byte order. */
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
58 void *
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
59 md2_read_ctx (const struct md2_ctx *ctx, void *resbuf)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
60 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
61 memcpy (resbuf, ctx->X, 16);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
62
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
63 return resbuf;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
64 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
65
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
66 /* Process the remaining bytes in the internal buffer and the usual
9659
5680cf5b5595 md2: clarify comments to say that alignment is not required.
Simon Josefsson <simon@josefsson.org>
parents: 7584
diff changeset
67 prolog according to the standard and write the result to RESBUF. */
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
68 void *
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
69 md2_finish_ctx (struct md2_ctx *ctx, void *resbuf)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
70 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
71 unsigned long i, k;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
72
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
73 /* pad the message */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
74 k = 16 - ctx->curlen;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
75 for (i = ctx->curlen; i < 16; i++)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
76 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
77 ctx->buf[i] = (unsigned char) k;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
78 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
79
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
80 /* hash and update */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
81 md2_compress (ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
82 md2_update_chksum (ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
83
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
84 /* hash checksum */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
85 memcpy (ctx->buf, ctx->chksum, 16);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
86 md2_compress (ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
87
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
88 return md2_read_ctx (ctx, resbuf);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
89 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
90
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
91 /* Compute MD2 message digest for bytes read from STREAM. The
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
92 resulting message digest number will be written into the 16 bytes
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
93 beginning at RESBLOCK. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
94 int
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
95 md2_stream (FILE *stream, void *resblock)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
96 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
97 struct md2_ctx ctx;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
98 size_t sum;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
99
12198
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
100 char *buffer = malloc (BLOCKSIZE + 72);
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
101 if (!buffer)
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
102 return 1;
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
103
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
104 /* Initialize the computation context. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
105 md2_init_ctx (&ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
106
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
107 /* Iterate over full file contents. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
108 while (1)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
109 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
110 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
111 computation function processes the whole buffer so that with the
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
112 next round of the loop another block can be read. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
113 size_t n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
114 sum = 0;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
115
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
116 /* Read block. Take care for partial reads. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
117 while (1)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
118 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
119 n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
120
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
121 sum += n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
122
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
123 if (sum == BLOCKSIZE)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
124 break;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
125
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
126 if (n == 0)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
127 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
128 /* Check for the error flag IFF N == 0, so that we don't
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
129 exit the loop after a partial read due to e.g., EAGAIN
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
130 or EWOULDBLOCK. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
131 if (ferror (stream))
12198
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
132 {
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
133 free (buffer);
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
134 return 1;
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
135 }
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
136 goto process_partial_block;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
137 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
138
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
139 /* We've read at least one byte, so ignore errors. But always
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
140 check for EOF, since feof may be true even though N > 0.
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
141 Otherwise, we could end up calling fread after EOF. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
142 if (feof (stream))
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
143 goto process_partial_block;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
144 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
145
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
146 /* Process buffer with BLOCKSIZE bytes. Note that
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
147 BLOCKSIZE % 64 == 0
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
148 */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
149 md2_process_block (buffer, BLOCKSIZE, &ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
150 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
151
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
152 process_partial_block:;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
153
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
154 /* Process any remaining bytes. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
155 if (sum > 0)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
156 md2_process_bytes (buffer, sum, &ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
157
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
158 /* Construct result in desired memory. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
159 md2_finish_ctx (&ctx, resblock);
12198
e8fbc5424b99 digests, copy-file: increase the IO buffer size from 4KiB to 32KiB
Pádraig Brady <P@draigBrady.com>
parents: 9659
diff changeset
160 free (buffer);
6431
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
161 return 0;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
162 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
163
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
164 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
165 result is always in little endian byte order, so that a byte-wise
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
166 output yields to the wanted ASCII representation of the message
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
167 digest. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
168 void *
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
169 md2_buffer (const char *buffer, size_t len, void *resblock)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
170 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
171 struct md2_ctx ctx;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
172
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
173 /* Initialize the computation context. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
174 md2_init_ctx (&ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
175
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
176 /* Process whole buffer but last len % 64 bytes. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
177 md2_process_block (buffer, len, &ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
178
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
179 /* Put result in desired memory area. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
180 return md2_finish_ctx (&ctx, resblock);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
181 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
182
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
183 void
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
184 md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
185 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
186 const char *in = buffer;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
187 unsigned long n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
188
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
189 while (len > 0)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
190 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
191 n = MIN (len, (16 - ctx->curlen));
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
192 memcpy (ctx->buf + ctx->curlen, in, (size_t) n);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
193 ctx->curlen += n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
194 in += n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
195 len -= n;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
196
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
197 /* is 16 bytes full? */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
198 if (ctx->curlen == 16)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
199 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
200 md2_compress (ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
201 md2_update_chksum (ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
202 ctx->curlen = 0;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
203 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
204 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
205 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
206
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
207 static const unsigned char PI_SUBST[256] = {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
208 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
209 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
210 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
211 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
212 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
213 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
214 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
215 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
216 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
217 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
218 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
219 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
220 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
221 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
222 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
223 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
224 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
225 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
226 };
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
227
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
228 /* adds 16 bytes to the checksum */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
229 static void
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
230 md2_update_chksum (struct md2_ctx *ctx)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
231 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
232 int j;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
233 unsigned char L;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
234
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
235 L = ctx->chksum[15];
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
236 for (j = 0; j < 16; j++)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
237 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
238 /* caution, the RFC says its "C[j] = S[M[i*16+j] xor L]" but the
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
239 reference source code [and test vectors] say otherwise. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
240 L = (ctx->chksum[j] ^= PI_SUBST[(int) (ctx->buf[j] ^ L)] & 255);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
241 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
242 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
243
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
244 static void
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
245 md2_compress (struct md2_ctx *ctx)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
246 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
247 size_t j, k;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
248 unsigned char t;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
249
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
250 /* copy block */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
251 for (j = 0; j < 16; j++)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
252 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
253 ctx->X[16 + j] = ctx->buf[j];
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
254 ctx->X[32 + j] = ctx->X[j] ^ ctx->X[16 + j];
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
255 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
256
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
257 t = (unsigned char) 0;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
258
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
259 /* do 18 rounds */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
260 for (j = 0; j < 18; j++)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
261 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
262 for (k = 0; k < 48; k++)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
263 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
264 t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
265 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
266 t = (t + (unsigned char) j) & 255;
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
267 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
268 }
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
269
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
270 /* Process LEN bytes of BUFFER, accumulating context into CTX. */
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
271 void
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
272 md2_process_block (const void *buffer, size_t len, struct md2_ctx *ctx)
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
273 {
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
274 md2_process_bytes (buffer, len, ctx);
076accb971ef Add MD2 and hash fixes.
Simon Josefsson <simon@josefsson.org>
parents:
diff changeset
275 }