29#define F(X,Y,Z) (((X)&(Y)) | ((~(X))&(Z)))
30#define G(X,Y,Z) (((X)&(Y)) | ((X)&(Z)) | ((Y)&(Z)))
31#define H(X,Y,Z) ((X)^(Y)^(Z))
32#define lshift(x,s) (((x)<<(s)) | ((x)>>(32-(s))))
34#define ROUND1(a,b,c,d,k,s) a = lshift(a + F(b,c,d) + X[k], s)
35#define ROUND2(a,b,c,d,k,s) a = lshift(a + G(b,c,d) + X[k] + 0x5A827999U, s)
36#define ROUND3(a,b,c,d,k,s) a = lshift(a + H(b,c,d) + X[k] + 0x6ED9EBA1U, s)
39static unsigned char PADDING[64] = {
40 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
45static void rs_mdfour_block(
rs_mdfour_t *md,
void const *p);
59static void rs_mdfour64(
rs_mdfour_t *m,
const void *p)
61 uint32_t AA, BB, CC, DD;
63 const uint32_t *X = (
const uint32_t *)p;
74 ROUND1(A, B, C, D, 0, 3);
75 ROUND1(D, A, B, C, 1, 7);
76 ROUND1(C, D, A, B, 2, 11);
77 ROUND1(B, C, D, A, 3, 19);
78 ROUND1(A, B, C, D, 4, 3);
79 ROUND1(D, A, B, C, 5, 7);
80 ROUND1(C, D, A, B, 6, 11);
81 ROUND1(B, C, D, A, 7, 19);
82 ROUND1(A, B, C, D, 8, 3);
83 ROUND1(D, A, B, C, 9, 7);
84 ROUND1(C, D, A, B, 10, 11);
85 ROUND1(B, C, D, A, 11, 19);
86 ROUND1(A, B, C, D, 12, 3);
87 ROUND1(D, A, B, C, 13, 7);
88 ROUND1(C, D, A, B, 14, 11);
89 ROUND1(B, C, D, A, 15, 19);
91 ROUND2(A, B, C, D, 0, 3);
92 ROUND2(D, A, B, C, 4, 5);
93 ROUND2(C, D, A, B, 8, 9);
94 ROUND2(B, C, D, A, 12, 13);
95 ROUND2(A, B, C, D, 1, 3);
96 ROUND2(D, A, B, C, 5, 5);
97 ROUND2(C, D, A, B, 9, 9);
98 ROUND2(B, C, D, A, 13, 13);
99 ROUND2(A, B, C, D, 2, 3);
100 ROUND2(D, A, B, C, 6, 5);
101 ROUND2(C, D, A, B, 10, 9);
102 ROUND2(B, C, D, A, 14, 13);
103 ROUND2(A, B, C, D, 3, 3);
104 ROUND2(D, A, B, C, 7, 5);
105 ROUND2(C, D, A, B, 11, 9);
106 ROUND2(B, C, D, A, 15, 13);
108 ROUND3(A, B, C, D, 0, 3);
109 ROUND3(D, A, B, C, 8, 9);
110 ROUND3(C, D, A, B, 4, 11);
111 ROUND3(B, C, D, A, 12, 15);
112 ROUND3(A, B, C, D, 2, 3);
113 ROUND3(D, A, B, C, 10, 9);
114 ROUND3(C, D, A, B, 6, 11);
115 ROUND3(B, C, D, A, 14, 15);
116 ROUND3(A, B, C, D, 1, 3);
117 ROUND3(D, A, B, C, 9, 9);
118 ROUND3(C, D, A, B, 5, 11);
119 ROUND3(B, C, D, A, 13, 15);
120 ROUND3(A, B, C, D, 3, 3);
121 ROUND3(D, A, B, C, 11, 9);
122 ROUND3(C, D, A, B, 7, 11);
123 ROUND3(B, C, D, A, 15, 15);
143inline static void copy4(
unsigned char *out, uint32_t
const x)
145 out[0] = (
unsigned char)(x);
146 out[1] = (
unsigned char)(x >> 8);
147 out[2] = (
unsigned char)(x >> 16);
148 out[3] = (
unsigned char)(x >> 24);
154inline static void copy8(
unsigned char *out, uint64_t
const x)
156 out[0] = (
unsigned char)(x);
157 out[1] = (
unsigned char)(x >> 8);
158 out[2] = (
unsigned char)(x >> 16);
159 out[3] = (
unsigned char)(x >> 24);
160 out[4] = (
unsigned char)(x >> 32);
161 out[5] = (
unsigned char)(x >> 40);
162 out[6] = (
unsigned char)(x >> 48);
163 out[7] = (
unsigned char)(x >> 56);
168#ifdef WORDS_BIGENDIAN
169inline static void copy64( uint32_t *M,
unsigned char const *in)
175 (((uint32_t)in[3] << 24) | ((uint32_t)in[2] << 16) |
176 ((uint32_t)in[1] << 8) | (uint32_t)in[0]);
183inline static void rs_mdfour_block(
rs_mdfour_t *md,
void const *p)
196inline static void rs_mdfour_block(
rs_mdfour_t *md,
void const *p)
208inline static void rs_mdfour_block(
rs_mdfour_t *md,
void const *p)
210 if ((uintptr_t)p & 3) {
213 memcpy(M, p, 16 *
sizeof(uint32_t));
216 rs_mdfour64(md, (
const uint32_t *)p);
225 memset(md, 0,
sizeof(*md));
233 md->totalN_hi = md->totalN_lo = 0;
251 unsigned char buf[8];
259 b[0] = m->totalN_lo << 3;
260 b[1] = ((m->totalN_hi << 3) | (m->totalN_lo >> 29));
262 copy4(buf + 4, b[1]);
266 pad_len = (m->tail_len < 56) ? (56 - m->tail_len) : (120 - m->tail_len);
274 unsigned char const *in = (
unsigned char const *)in_void;
280 if ((md->totalN_lo += n) < n)
287 size_t tail_gap = 64 - md->tail_len;
289 memcpy(&md->tail[md->tail_len], in, tail_gap);
290 rs_mdfour_block(md, md->tail);
298 rs_mdfour_block(md, in);
304 memcpy(&md->tail[md->tail_len], in, n);
305 md->tail_len += (int)n;
309void rs_mdfour_result(
rs_mdfour_t *md,
unsigned char *out)
314 copy4(out + 4, md->B);
315 copy4(out + 8, md->C);
316 copy4(out + 12, md->D);
319void rs_mdfour(
unsigned char *out,
void const *in,
size_t n)
323 rs_mdfour_begin(&md);
325 rs_mdfour_result(&md, out);
Public header for librsync.
LIBRSYNC_EXPORT void rs_mdfour_update(rs_mdfour_t *md, void const *in_void, size_t n)
Feed some data into the MD4 accumulator.
MD4 message digest algorithm.
The rs_mdfour state type.