linux-qubasis
linux oasis port as a qubes template
git clone https://9o.is/git/linux-qubasis.git
0029-rsync-Add-implementation-of-MD4.patch
(12263B)
1 From f6b4408dd3b8ddfa1dca692e1c52643d857d8102 Mon Sep 17 00:00:00 2001
2 From: Michael Forney <mforney@mforney.org>
3 Date: Wed, 15 Apr 2020 22:10:06 -0700
4 Subject: [PATCH] rsync: Add implementation of MD4
5
6 ---
7 usr.bin/rsync/Makefile | 2 +-
8 usr.bin/rsync/blocks.c | 2 +-
9 usr.bin/rsync/downloader.c | 2 +-
10 usr.bin/rsync/extern.h | 3 +-
11 usr.bin/rsync/hash.c | 2 +-
12 usr.bin/rsync/md4.c | 266 +++++++++++++++++++++++++++++++++++++
13 usr.bin/rsync/md4.h | 47 +++++++
14 usr.bin/rsync/sender.c | 2 +-
15 8 files changed, 320 insertions(+), 6 deletions(-)
16 create mode 100644 usr.bin/rsync/md4.c
17 create mode 100644 usr.bin/rsync/md4.h
18
19 diff --git a/usr.bin/rsync/Makefile b/usr.bin/rsync/Makefile
20 index 3c60f18e07f..172045ce7ac 100644
21 --- a/usr.bin/rsync/Makefile
22 +++ b/usr.bin/rsync/Makefile
23 @@ -2,7 +2,7 @@
24
25 PROG= openrsync
26 SRCS= blocks.c client.c copy.c downloader.c fargs.c flist.c hash.c ids.c \
27 - io.c log.c main.c misc.c mkpath.c mktemp.c receiver.c rmatch.c \
28 + io.c log.c main.c md4.c misc.c mkpath.c mktemp.c receiver.c rmatch.c \
29 rules.c sender.c server.c session.c socket.c symlinks.c uploader.c
30 LDADD+= -lcrypto -lm -lutil
31 DPADD+= ${LIBCRYPTO} ${LIBM} ${LIBUTIL}
32 diff --git a/usr.bin/rsync/blocks.c b/usr.bin/rsync/blocks.c
33 index 8f4bcb532e1..f21c9178487 100644
34 --- a/usr.bin/rsync/blocks.c
35 +++ b/usr.bin/rsync/blocks.c
36 @@ -26,7 +26,7 @@
37 #include <string.h>
38 #include <unistd.h>
39
40 -#include <openssl/md4.h>
41 +#include "md4.h"
42
43 #include "extern.h"
44
45 diff --git a/usr.bin/rsync/downloader.c b/usr.bin/rsync/downloader.c
46 index 07ec334f6b4..6543851fd2c 100644
47 --- a/usr.bin/rsync/downloader.c
48 +++ b/usr.bin/rsync/downloader.c
49 @@ -28,7 +28,7 @@
50 #include <time.h>
51 #include <unistd.h>
52
53 -#include <openssl/md4.h>
54 +#include "md4.h"
55
56 #include "extern.h"
57
58 diff --git a/usr.bin/rsync/extern.h b/usr.bin/rsync/extern.h
59 index 55d7bc26ae2..d6b02fd4ad4 100644
60 --- a/usr.bin/rsync/extern.h
61 +++ b/usr.bin/rsync/extern.h
62 @@ -19,7 +19,8 @@
63
64 #include <stdint.h>
65 #include <sys/types.h>
66 -#include <openssl/md4.h>
67 +
68 +#include "md4.h"
69
70 /*
71 * This is the rsync protocol version that we support.
72 diff --git a/usr.bin/rsync/hash.c b/usr.bin/rsync/hash.c
73 index 37529e951b4..e3f52047404 100644
74 --- a/usr.bin/rsync/hash.c
75 +++ b/usr.bin/rsync/hash.c
76 @@ -21,7 +21,7 @@
77 #include <stdint.h>
78 #include <stdlib.h>
79
80 -#include <openssl/md4.h>
81 +#include "md4.h"
82
83 #include "extern.h"
84
85 diff --git a/usr.bin/rsync/md4.c b/usr.bin/rsync/md4.c
86 new file mode 100644
87 index 00000000000..528f985563f
88 --- /dev/null
89 +++ b/usr.bin/rsync/md4.c
90 @@ -0,0 +1,266 @@
91 +/*
92 + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
93 + * MD4 Message-Digest Algorithm (RFC 1320).
94 + *
95 + * Homepage:
96 + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md4
97 + *
98 + * Author:
99 + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
100 + *
101 + * This software was written by Alexander Peslyak in 2001. No copyright is
102 + * claimed, and the software is hereby placed in the public domain.
103 + * In case this attempt to disclaim copyright and place the software in the
104 + * public domain is deemed null and void, then the software is
105 + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
106 + * general public under the following terms:
107 + *
108 + * Redistribution and use in source and binary forms, with or without
109 + * modification, are permitted.
110 + *
111 + * There's ABSOLUTELY NO WARRANTY, express or implied.
112 + *
113 + * (This is a heavily cut-down "BSD license".)
114 + *
115 + * This differs from Colin Plumb's older public domain implementation in that
116 + * no exactly 32-bit integer data type is required (any 32-bit or wider
117 + * unsigned integer data type will do), there's no compile-time endianness
118 + * configuration, and the function prototypes match OpenSSL's. No code from
119 + * Colin Plumb's implementation has been reused; this comment merely compares
120 + * the properties of the two independent implementations.
121 + *
122 + * The primary goals of this implementation are portability and ease of use.
123 + * It is meant to be fast, but not as fast as possible. Some known
124 + * optimizations are not included to reduce source code size and avoid
125 + * compile-time configuration.
126 + */
127 +
128 +#include <string.h>
129 +
130 +#include "md4.h"
131 +
132 +/*
133 + * The basic MD4 functions.
134 + *
135 + * F and G are optimized compared to their RFC 1320 definitions, with the
136 + * optimization for F borrowed from Colin Plumb's MD5 implementation.
137 + */
138 +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
139 +#define G(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
140 +#define H(x, y, z) ((x) ^ (y) ^ (z))
141 +
142 +/*
143 + * The MD4 transformation for all three rounds.
144 + */
145 +#define STEP(f, a, b, c, d, x, s) \
146 + (a) += f((b), (c), (d)) + (x); \
147 + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s))));
148 +
149 +/*
150 + * SET reads 4 input bytes in little-endian byte order and stores them in a
151 + * properly aligned word in host byte order.
152 + *
153 + * The check for little-endian architectures that tolerate unaligned memory
154 + * accesses is just an optimization. Nothing will break if it fails to detect
155 + * a suitable architecture.
156 + *
157 + * Unfortunately, this optimization may be a C strict aliasing rules violation
158 + * if the caller's data buffer has effective type that cannot be aliased by
159 + * MD4_u32plus. In practice, this problem may occur if these MD4 routines are
160 + * inlined into a calling function, or with future and dangerously advanced
161 + * link-time optimizations. For the time being, keeping these MD4 routines in
162 + * their own translation unit avoids the problem.
163 + */
164 +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
165 +#define SET(n) \
166 + (*(MD4_u32plus *)&ptr[(n) * 4])
167 +#define GET(n) \
168 + SET(n)
169 +#else
170 +#define SET(n) \
171 + (ctx->block[(n)] = \
172 + (MD4_u32plus)ptr[(n) * 4] | \
173 + ((MD4_u32plus)ptr[(n) * 4 + 1] << 8) | \
174 + ((MD4_u32plus)ptr[(n) * 4 + 2] << 16) | \
175 + ((MD4_u32plus)ptr[(n) * 4 + 3] << 24))
176 +#define GET(n) \
177 + (ctx->block[(n)])
178 +#endif
179 +
180 +/*
181 + * This processes one or more 64-byte data blocks, but does NOT update the bit
182 + * counters. There are no alignment requirements.
183 + */
184 +static const void *body(MD4_CTX *ctx, const void *data, unsigned long size)
185 +{
186 + const unsigned char *ptr;
187 + MD4_u32plus a, b, c, d;
188 + MD4_u32plus saved_a, saved_b, saved_c, saved_d;
189 + const MD4_u32plus ac1 = 0x5a827999, ac2 = 0x6ed9eba1;
190 +
191 + ptr = (const unsigned char *)data;
192 +
193 + a = ctx->a;
194 + b = ctx->b;
195 + c = ctx->c;
196 + d = ctx->d;
197 +
198 + do {
199 + saved_a = a;
200 + saved_b = b;
201 + saved_c = c;
202 + saved_d = d;
203 +
204 +/* Round 1 */
205 + STEP(F, a, b, c, d, SET(0), 3)
206 + STEP(F, d, a, b, c, SET(1), 7)
207 + STEP(F, c, d, a, b, SET(2), 11)
208 + STEP(F, b, c, d, a, SET(3), 19)
209 + STEP(F, a, b, c, d, SET(4), 3)
210 + STEP(F, d, a, b, c, SET(5), 7)
211 + STEP(F, c, d, a, b, SET(6), 11)
212 + STEP(F, b, c, d, a, SET(7), 19)
213 + STEP(F, a, b, c, d, SET(8), 3)
214 + STEP(F, d, a, b, c, SET(9), 7)
215 + STEP(F, c, d, a, b, SET(10), 11)
216 + STEP(F, b, c, d, a, SET(11), 19)
217 + STEP(F, a, b, c, d, SET(12), 3)
218 + STEP(F, d, a, b, c, SET(13), 7)
219 + STEP(F, c, d, a, b, SET(14), 11)
220 + STEP(F, b, c, d, a, SET(15), 19)
221 +
222 +/* Round 2 */
223 + STEP(G, a, b, c, d, GET(0) + ac1, 3)
224 + STEP(G, d, a, b, c, GET(4) + ac1, 5)
225 + STEP(G, c, d, a, b, GET(8) + ac1, 9)
226 + STEP(G, b, c, d, a, GET(12) + ac1, 13)
227 + STEP(G, a, b, c, d, GET(1) + ac1, 3)
228 + STEP(G, d, a, b, c, GET(5) + ac1, 5)
229 + STEP(G, c, d, a, b, GET(9) + ac1, 9)
230 + STEP(G, b, c, d, a, GET(13) + ac1, 13)
231 + STEP(G, a, b, c, d, GET(2) + ac1, 3)
232 + STEP(G, d, a, b, c, GET(6) + ac1, 5)
233 + STEP(G, c, d, a, b, GET(10) + ac1, 9)
234 + STEP(G, b, c, d, a, GET(14) + ac1, 13)
235 + STEP(G, a, b, c, d, GET(3) + ac1, 3)
236 + STEP(G, d, a, b, c, GET(7) + ac1, 5)
237 + STEP(G, c, d, a, b, GET(11) + ac1, 9)
238 + STEP(G, b, c, d, a, GET(15) + ac1, 13)
239 +
240 +/* Round 3 */
241 + STEP(H, a, b, c, d, GET(0) + ac2, 3)
242 + STEP(H, d, a, b, c, GET(8) + ac2, 9)
243 + STEP(H, c, d, a, b, GET(4) + ac2, 11)
244 + STEP(H, b, c, d, a, GET(12) + ac2, 15)
245 + STEP(H, a, b, c, d, GET(2) + ac2, 3)
246 + STEP(H, d, a, b, c, GET(10) + ac2, 9)
247 + STEP(H, c, d, a, b, GET(6) + ac2, 11)
248 + STEP(H, b, c, d, a, GET(14) + ac2, 15)
249 + STEP(H, a, b, c, d, GET(1) + ac2, 3)
250 + STEP(H, d, a, b, c, GET(9) + ac2, 9)
251 + STEP(H, c, d, a, b, GET(5) + ac2, 11)
252 + STEP(H, b, c, d, a, GET(13) + ac2, 15)
253 + STEP(H, a, b, c, d, GET(3) + ac2, 3)
254 + STEP(H, d, a, b, c, GET(11) + ac2, 9)
255 + STEP(H, c, d, a, b, GET(7) + ac2, 11)
256 + STEP(H, b, c, d, a, GET(15) + ac2, 15)
257 +
258 + a += saved_a;
259 + b += saved_b;
260 + c += saved_c;
261 + d += saved_d;
262 +
263 + ptr += 64;
264 + } while (size -= 64);
265 +
266 + ctx->a = a;
267 + ctx->b = b;
268 + ctx->c = c;
269 + ctx->d = d;
270 +
271 + return ptr;
272 +}
273 +
274 +void MD4_Init(MD4_CTX *ctx)
275 +{
276 + ctx->a = 0x67452301;
277 + ctx->b = 0xefcdab89;
278 + ctx->c = 0x98badcfe;
279 + ctx->d = 0x10325476;
280 +
281 + ctx->lo = 0;
282 + ctx->hi = 0;
283 +}
284 +
285 +void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
286 +{
287 + MD4_u32plus saved_lo;
288 + unsigned long used, available;
289 +
290 + saved_lo = ctx->lo;
291 + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
292 + ctx->hi++;
293 + ctx->hi += size >> 29;
294 +
295 + used = saved_lo & 0x3f;
296 +
297 + if (used) {
298 + available = 64 - used;
299 +
300 + if (size < available) {
301 + memcpy(&ctx->buffer[used], data, size);
302 + return;
303 + }
304 +
305 + memcpy(&ctx->buffer[used], data, available);
306 + data = (const unsigned char *)data + available;
307 + size -= available;
308 + body(ctx, ctx->buffer, 64);
309 + }
310 +
311 + if (size >= 64) {
312 + data = body(ctx, data, size & ~(unsigned long)0x3f);
313 + size &= 0x3f;
314 + }
315 +
316 + memcpy(ctx->buffer, data, size);
317 +}
318 +
319 +#define OUT(dst, src) \
320 + (dst)[0] = (unsigned char)(src); \
321 + (dst)[1] = (unsigned char)((src) >> 8); \
322 + (dst)[2] = (unsigned char)((src) >> 16); \
323 + (dst)[3] = (unsigned char)((src) >> 24);
324 +
325 +void MD4_Final(unsigned char *result, MD4_CTX *ctx)
326 +{
327 + unsigned long used, available;
328 +
329 + used = ctx->lo & 0x3f;
330 +
331 + ctx->buffer[used++] = 0x80;
332 +
333 + available = 64 - used;
334 +
335 + if (available < 8) {
336 + memset(&ctx->buffer[used], 0, available);
337 + body(ctx, ctx->buffer, 64);
338 + used = 0;
339 + available = 64;
340 + }
341 +
342 + memset(&ctx->buffer[used], 0, available - 8);
343 +
344 + ctx->lo <<= 3;
345 + OUT(&ctx->buffer[56], ctx->lo)
346 + OUT(&ctx->buffer[60], ctx->hi)
347 +
348 + body(ctx, ctx->buffer, 64);
349 +
350 + OUT(&result[0], ctx->a)
351 + OUT(&result[4], ctx->b)
352 + OUT(&result[8], ctx->c)
353 + OUT(&result[12], ctx->d)
354 +
355 + memset(ctx, 0, sizeof(*ctx));
356 +}
357 diff --git a/usr.bin/rsync/md4.h b/usr.bin/rsync/md4.h
358 new file mode 100644
359 index 00000000000..ebf5bb555a0
360 --- /dev/null
361 +++ b/usr.bin/rsync/md4.h
362 @@ -0,0 +1,47 @@
363 +/*
364 + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
365 + * MD4 Message-Digest Algorithm (RFC 1320).
366 + *
367 + * Homepage:
368 + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md4
369 + *
370 + * Author:
371 + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
372 + *
373 + * This software was written by Alexander Peslyak in 2001. No copyright is
374 + * claimed, and the software is hereby placed in the public domain.
375 + * In case this attempt to disclaim copyright and place the software in the
376 + * public domain is deemed null and void, then the software is
377 + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
378 + * general public under the following terms:
379 + *
380 + * Redistribution and use in source and binary forms, with or without
381 + * modification, are permitted.
382 + *
383 + * There's ABSOLUTELY NO WARRANTY, express or implied.
384 + *
385 + * See md4.c for more information.
386 + */
387 +
388 +#ifndef _MD4_H
389 +#define _MD4_H
390 +
391 +#include <stdint.h>
392 +
393 +#define MD4_DIGEST_LENGTH 16
394 +
395 +/* Any 32-bit or wider unsigned integer data type will do */
396 +typedef uint_fast32_t MD4_u32plus;
397 +
398 +typedef struct {
399 + MD4_u32plus lo, hi;
400 + MD4_u32plus a, b, c, d;
401 + unsigned char buffer[64];
402 + MD4_u32plus block[16];
403 +} MD4_CTX;
404 +
405 +extern void MD4_Init(MD4_CTX *ctx);
406 +extern void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size);
407 +extern void MD4_Final(unsigned char *result, MD4_CTX *ctx);
408 +
409 +#endif
410 diff --git a/usr.bin/rsync/sender.c b/usr.bin/rsync/sender.c
411 index 6469e7f27e5..81b25b9ee78 100644
412 --- a/usr.bin/rsync/sender.c
413 +++ b/usr.bin/rsync/sender.c
414 @@ -26,7 +26,7 @@
415 #include <string.h>
416 #include <unistd.h>
417
418 -#include <openssl/md4.h>
419 +#include "md4.h"
420
421 #include "extern.h"
422
423 --
424 2.49.0
425