annotate lib/sha.c @ 2867:6d88857e7e6c

checkpoint
author Jim Meyering <jim@meyering.net>
date Sun, 17 Sep 2000 12:54:25 +0000
parents 33ef979547bd
children 665842f23067
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* sha.c - Functions to compute the SHA1 hash (message-digest) of files
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 or blocks of memory. Complies to the NIST specification FIPS-180-1.
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 Copyright (C) 2000 Scott G. Miller
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 Credits:
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 Robert Klep <robert@ilse.nl> -- Expansion function fix
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8 */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 #ifdef HAVE_CONFIG_H
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 # include <config.h>
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 #endif
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 #include <sys/types.h>
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 #if STDC_HEADERS || defined _LIBC
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17 # include <stdlib.h>
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 # include <string.h>
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 #else
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 # ifndef HAVE_MEMCPY
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 # define memcpy(d, s, n) bcopy ((s), (d), (n))
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 # endif
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 #endif
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include "md5.h"
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include "sha.h"
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 /*
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 Not-swap is a macro that does an endian swap on architectures that are
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 big-endian, as SHA needs some data in a little-endian format
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 #ifdef WORDS_BIGENDIAN
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 # define NOTSWAP(n) (n)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 # define SWAP(n) \
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 #else
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 # define NOTSWAP(n) \
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 # define SWAP(n) (n)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 #endif
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 /* This array contains the bytes used to pad the buffer to the next
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 64-byte boundary. (RFC 1321, 3.1: Step 1) */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 /*
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 Takes a pointer to a 160 bit block of data (five 32 bit ints) and
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 intializes it to the start constants of the SHA1 algorithm. This
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 must be called before using hash in the call to sha_hash
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 void
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 sha_init_ctx (struct sha_ctx *ctx)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 ctx->A = 0x67452301;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 ctx->B = 0xefcdab89;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 ctx->C = 0x98badcfe;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 ctx->D = 0x10325476;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 ctx->E = 0xc3d2e1f0;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 ctx->total[0] = ctx->total[1] = 0;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 ctx->buflen = 0;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 /* Put result from CTX in first 20 bytes following RESBUF. The result
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 must be in little endian byte order.
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 IMPORTANT: On some systems it is required that RESBUF is correctly
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 aligned for a 32 bits value. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 void *
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 sha_read_ctx (const struct sha_ctx *ctx, void *resbuf)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 ((md5_uint32 *) resbuf)[0] = NOTSWAP (ctx->A);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 ((md5_uint32 *) resbuf)[1] = NOTSWAP (ctx->B);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 ((md5_uint32 *) resbuf)[2] = NOTSWAP (ctx->C);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 ((md5_uint32 *) resbuf)[3] = NOTSWAP (ctx->D);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 ((md5_uint32 *) resbuf)[4] = NOTSWAP (ctx->E);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 return resbuf;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 /* Process the remaining bytes in the internal buffer and the usual
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 prolog according to the standard and write the result to RESBUF.
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 IMPORTANT: On some systems it is required that RESBUF is correctly
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 aligned for a 32 bits value. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 void *
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 sha_finish_ctx (struct sha_ctx *ctx, void *resbuf)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 /* Take yet unprocessed bytes into account. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 md5_uint32 bytes = ctx->buflen;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 size_t pad;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 /* Now count remaining bytes. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 ctx->total[0] += bytes;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 if (ctx->total[0] < bytes)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 ++ctx->total[1];
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 memcpy (&ctx->buffer[bytes], fillbuf, pad);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 /* Put the 64-bit file length in *bits* at the end of the buffer. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = NOTSWAP (ctx->total[0] << 3);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 *(md5_uint32 *) &ctx->buffer[bytes + pad] = NOTSWAP ((ctx->total[1] << 3) |
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 (ctx->total[0] >> 29));
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 /* Process last bytes. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 sha_process_block (ctx->buffer, bytes + pad + 8, ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 return sha_read_ctx (ctx, resbuf);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 /* Compute SHA1 message digest for bytes read from STREAM. The
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 resulting message digest number will be written into the 16 bytes
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 beginning at RESBLOCK. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 int
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 sha_stream (FILE *stream, void *resblock)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 /* Important: BLOCKSIZE must be a multiple of 64. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 #define BLOCKSIZE 4096
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 struct sha_ctx ctx;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 char buffer[BLOCKSIZE + 72];
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 size_t sum;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 /* Initialize the computation context. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 sha_init_ctx (&ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 /* Iterate over full file contents. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 while (1)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 computation function processes the whole buffer so that with the
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 next round of the loop another block can be read. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 size_t n;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 sum = 0;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 /* Read block. Take care for partial reads. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 do
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 sum += n;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145 while (sum < BLOCKSIZE && n != 0);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146 if (n == 0 && ferror (stream))
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 return 1;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 /* If end of file is reached, end the loop. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 if (n == 0)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 break;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 /* Process buffer with BLOCKSIZE bytes. Note that
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 BLOCKSIZE % 64 == 0
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 sha_process_block (buffer, BLOCKSIZE, &ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159 /* Add the last bytes if necessary. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160 if (sum > 0)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 sha_process_bytes (buffer, sum, &ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 /* Construct result in desired memory. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164 sha_finish_ctx (&ctx, resblock);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165 return 0;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169 result is always in little endian byte order, so that a byte-wise
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 output yields to the wanted ASCII representation of the message
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 digest. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 void *
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 sha_buffer (const char *buffer, size_t len, void *resblock)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175 struct sha_ctx ctx;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 /* Initialize the computation context. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 sha_init_ctx (&ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180 /* Process whole buffer but last len % 64 bytes. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181 sha_process_bytes (buffer, len, &ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 /* Put result in desired memory area. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184 return sha_finish_ctx (&ctx, resblock);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187 void
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 sha_process_bytes (const void *buffer, size_t len, struct sha_ctx *ctx)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 /* When we already have some bits in our internal buffer concatenate
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 both inputs first. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 if (ctx->buflen != 0)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 size_t left_over = ctx->buflen;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 size_t add = 128 - left_over > len ? len : 128 - left_over;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 memcpy (&ctx->buffer[left_over], buffer, add);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 ctx->buflen += add;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 if (left_over + add > 64)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 sha_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 /* The regions in the following copy operation cannot overlap. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
204 memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
205 (left_over + add) & 63);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206 ctx->buflen = (left_over + add) & 63;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
207 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209 buffer = (const char *) buffer + add;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 len -= add;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
213 /* Process available complete blocks. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 if (len > 64)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216 sha_process_block (buffer, len & ~63, ctx);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 buffer = (const char *) buffer + (len & ~63);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 len &= 63;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221 /* Move remaining bytes in internal buffer. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 if (len > 0)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224 memcpy (ctx->buffer, buffer, len);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225 ctx->buflen = len;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
227 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 /* --- Code below is the primary difference between md5.c and sha.c --- */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
231 /* SHA1 round constants */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
232 #define K1 0x5a827999L
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
233 #define K2 0x6ed9eba1L
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
234 #define K3 0x8f1bbcdcL
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235 #define K4 0xca62c1d6L
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
236
2864
26d60ac2d2ee moving to gnupg's version of sha1.c
Jim Meyering <jim@meyering.net>
parents: 2863
diff changeset
237 /* Round functions. Note that F2() is used in both rounds 2 and 4 */
26d60ac2d2ee moving to gnupg's version of sha1.c
Jim Meyering <jim@meyering.net>
parents: 2863
diff changeset
238 #define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
26d60ac2d2ee moving to gnupg's version of sha1.c
Jim Meyering <jim@meyering.net>
parents: 2863
diff changeset
239 #define F2(B,C,D) (B ^ C ^ D)
26d60ac2d2ee moving to gnupg's version of sha1.c
Jim Meyering <jim@meyering.net>
parents: 2863
diff changeset
240 #define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
241
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
242 /* Process LEN bytes of BUFFER, accumulating context into CTX.
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
243 It is assumed that LEN % 64 == 0. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
244
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
245 void
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
246 sha_process_block (const void *buffer, size_t len, struct sha_ctx *ctx)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248 const md5_uint32 *words = buffer;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
249 size_t nwords = len / sizeof (md5_uint32);
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
250 const md5_uint32 *endp = words + nwords;
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
251 md5_uint32 x[80];
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
252 md5_uint32 a = ctx->A;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
253 md5_uint32 b = ctx->B;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
254 md5_uint32 c = ctx->C;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
255 md5_uint32 d = ctx->D;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
256 md5_uint32 e = ctx->E;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
257
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 /* First increment the byte count. RFC 1321 specifies the possible
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
259 length of the file up to 2^64 bits. Here we only compute the
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
260 number of bytes. Do a double word increment. */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
261 ctx->total[0] += len;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
262 if (ctx->total[0] < len)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
263 ++ctx->total[1];
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
264
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
265 #define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
266 ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
267 , (x[i&0x0f] = (tm << 1) | (tm >> 31)) )
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
268
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
269 #define R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
270 + f( b, c, d ) \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
271 + k \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
272 + m; \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
273 b = rol( b, 30 ); \
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
274 } while(0)
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
275
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
276 while (words < endp)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
277 {
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
278 int t;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
279 for (t = 0; t < 16; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
280 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
281 x[t] = NOTSWAP (*words);
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
282 words++;
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
283 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
284
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
285 /* SHA1 Data expansion */
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
286 for (t = 16; t < 80; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
287 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
288 md5_uint32 tmp = x[t - 3] ^ x[t - 8] ^ x[t - 14] ^ x[t - 16];
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
289 x[t] = rol (tmp, 1);
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
290 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
291
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
292 /* SHA1 main loop (t=0 to 79)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
293 This is broken down into four subloops in order to use
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
294 the correct round function and constant */
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
295 #if 1
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296 for (t = 0; t < 20; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
297 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
298 md5_uint32 tmp = rol (a, 5) + F1 (b, c, d) + e + x[t] + K1;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
299 e = d;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
300 d = c;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
301 c = rol (b, 30);
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
302 b = a;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
303 a = tmp;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
304 }
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
305 #else
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
306
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
307 #endif
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
308 for (; t < 40; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
309 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
310 md5_uint32 tmp = rol (a, 5) + F2 (b, c, d) + e + x[t] + K2;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
311 e = d;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
312 d = c;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
313 c = rol (b, 30);
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
314 b = a;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
315 a = tmp;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
316 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
317 for (; t < 60; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
318 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
319 md5_uint32 tmp = rol (a, 5) + F3 (b, c, d) + e + x[t] + K3;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
320 e = d;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
321 d = c;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
322 c = rol (b, 30);
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
323 b = a;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
324 a = tmp;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
325 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
326 for (; t < 80; t++)
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
327 {
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
328 md5_uint32 tmp = rol (a, 5) + F2 (b, c, d) + e + x[t] + K4;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
329 e = d;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
330 d = c;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
331 c = rol (b, 30);
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
332 b = a;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
333 a = tmp;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
334 }
2867
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
335 a = ctx->A += a;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
336 b = ctx->B += b;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
337 c = ctx->C += c;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
338 d = ctx->D += d;
6d88857e7e6c checkpoint
Jim Meyering <jim@meyering.net>
parents: 2866
diff changeset
339 e = ctx->E += e;
2863
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
340 }
a449e5769e22 snapshot of massaged original
Jim Meyering <jim@meyering.net>
parents:
diff changeset
341 }