annotate src/core/ngx_md5.c @ 9274:46ecad404a29 default tip

Mail: reset imap tag to empty after authentication attempt. We need to reset the imap tag to empty after an authentication attempt completes, otherwise if the next line parsed is incomplete with no tag (e.g. empty line) then we use the "tag" from the previous buffer which is now definitely wrong and has been partially overwritten with the most recently read data (e.g. CRLF). An example before this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: S: obar BAD invalid command Then with this patch: S: * OK IMAP4 ready C: foobar login a b S: foobar NO Incorrect username or password. C: S: * BAD invalid command
author Rob Mueller <robm@fastmailteam.com>
date Wed, 15 May 2024 10:06:00 +0300
parents 9eefb38f0005
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * An internal implementation, based on Alexander Peslyak's
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 * public domain implementation:
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_config.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_core.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 #include <ngx_md5.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 static const u_char *ngx_md5_body(ngx_md5_t *ctx, const u_char *data,
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15 size_t size);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 void
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
19 ngx_md5_init(ngx_md5_t *ctx)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
20 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 ctx->a = 0x67452301;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 ctx->b = 0xefcdab89;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 ctx->c = 0x98badcfe;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 ctx->d = 0x10325476;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
25
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 ctx->bytes = 0;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 }
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
29
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 void
3927
38e6f45c5e3d make built-in ngx_md5_update() interface consistent with other implemenations
Igor Sysoev <igor@sysoev.ru>
parents: 3900
diff changeset
31 ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size)
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
33 size_t used, free;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
34
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
35 used = (size_t) (ctx->bytes & 0x3f);
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
36 ctx->bytes += size;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
37
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38 if (used) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 free = 64 - used;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
40
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 if (size < free) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 ngx_memcpy(&ctx->buffer[used], data, size);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 return;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
45
4279
21167183825d Reverted incorrect change in internal md5 (part of r3928).
Maxim Dounin <mdounin@mdounin.ru>
parents: 3941
diff changeset
46 ngx_memcpy(&ctx->buffer[used], data, free);
21167183825d Reverted incorrect change in internal md5 (part of r3928).
Maxim Dounin <mdounin@mdounin.ru>
parents: 3941
diff changeset
47 data = (u_char *) data + free;
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 size -= free;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 (void) ngx_md5_body(ctx, ctx->buffer, 64);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
50 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
51
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 if (size >= 64) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 data = ngx_md5_body(ctx, data, size & ~(size_t) 0x3f);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 size &= 0x3f;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
56
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 ngx_memcpy(ctx->buffer, data, size);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 }
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 void
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 ngx_md5_final(u_char result[16], ngx_md5_t *ctx)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 size_t used, free;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
65
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
66 used = (size_t) (ctx->bytes & 0x3f);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
67
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 ctx->buffer[used++] = 0x80;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
69
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 free = 64 - used;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
71
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 if (free < 8) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 ngx_memzero(&ctx->buffer[used], free);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 (void) ngx_md5_body(ctx, ctx->buffer, 64);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 used = 0;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 free = 64;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
78
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_memzero(&ctx->buffer[used], free - 8);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
80
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 ctx->bytes <<= 3;
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
82 ctx->buffer[56] = (u_char) ctx->bytes;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
83 ctx->buffer[57] = (u_char) (ctx->bytes >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
84 ctx->buffer[58] = (u_char) (ctx->bytes >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
85 ctx->buffer[59] = (u_char) (ctx->bytes >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
86 ctx->buffer[60] = (u_char) (ctx->bytes >> 32);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
87 ctx->buffer[61] = (u_char) (ctx->bytes >> 40);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
88 ctx->buffer[62] = (u_char) (ctx->bytes >> 48);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
89 ctx->buffer[63] = (u_char) (ctx->bytes >> 56);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
90
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 (void) ngx_md5_body(ctx, ctx->buffer, 64);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
92
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
93 result[0] = (u_char) ctx->a;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
94 result[1] = (u_char) (ctx->a >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
95 result[2] = (u_char) (ctx->a >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
96 result[3] = (u_char) (ctx->a >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
97 result[4] = (u_char) ctx->b;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
98 result[5] = (u_char) (ctx->b >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
99 result[6] = (u_char) (ctx->b >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
100 result[7] = (u_char) (ctx->b >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
101 result[8] = (u_char) ctx->c;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
102 result[9] = (u_char) (ctx->c >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
103 result[10] = (u_char) (ctx->c >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
104 result[11] = (u_char) (ctx->c >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
105 result[12] = (u_char) ctx->d;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
106 result[13] = (u_char) (ctx->d >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
107 result[14] = (u_char) (ctx->d >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
108 result[15] = (u_char) (ctx->d >> 24);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
109
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 ngx_memzero(ctx, sizeof(*ctx));
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 }
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 * The basic MD5 functions.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 *
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 * F and G are optimized compared to their RFC 1321 definitions for
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 * architectures that lack an AND-NOT instruction, just like in
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 * Colin Plumb's implementation.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 #define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 #define H(x, y, z) ((x) ^ (y) ^ (z))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
126
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 * The MD5 transformation for all four rounds.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 #define STEP(f, a, b, c, d, x, t, s) \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 (a) += f((b), (c), (d)) + (x) + (t); \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 (a) += (b)
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
135
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 * SET() reads 4 input bytes in little-endian byte order and stores them
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 * in a properly aligned word in host byte order.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 *
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 * The check for little-endian architectures that tolerate unaligned
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 * memory accesses is just an optimization. Nothing will break if it
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 * does not work.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 #define SET(n) (*(uint32_t *) &p[n * 4])
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 #define GET(n) (*(uint32_t *) &p[n * 4])
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 #else
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 #define SET(n) \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 (block[n] = \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 (uint32_t) p[n * 4] | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 ((uint32_t) p[n * 4 + 1] << 8) | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 ((uint32_t) p[n * 4 + 2] << 16) | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 ((uint32_t) p[n * 4 + 3] << 24))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 #define GET(n) block[n]
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 #endif
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 * This processes one or more 64-byte data blocks, but does not update
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 * the bit counters. There are no alignment requirements.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 static const u_char *
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 ngx_md5_body(ngx_md5_t *ctx, const u_char *data, size_t size)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172 uint32_t a, b, c, d;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 uint32_t saved_a, saved_b, saved_c, saved_d;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 const u_char *p;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 #if !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 uint32_t block[16];
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 #endif
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
178
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 p = data;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
180
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 a = ctx->a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 b = ctx->b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 c = ctx->c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 d = ctx->d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
185
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 do {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 saved_a = a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 saved_b = b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 saved_c = c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 saved_d = d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
191
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 /* Round 1 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 STEP(F, c, d, a, b, SET(2), 0x242070db, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 STEP(F, c, d, a, b, SET(6), 0xa8304613, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 STEP(F, b, c, d, a, SET(7), 0xfd469501, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 STEP(F, a, b, c, d, SET(8), 0x698098d8, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 STEP(F, a, b, c, d, SET(12), 0x6b901122, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 STEP(F, d, a, b, c, SET(13), 0xfd987193, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 STEP(F, c, d, a, b, SET(14), 0xa679438e, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 STEP(F, b, c, d, a, SET(15), 0x49b40821, 22);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
210
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 /* Round 2 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 STEP(G, d, a, b, c, GET(6), 0xc040b340, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216 STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 STEP(G, d, a, b, c, GET(10), 0x02441453, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
229
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 /* Round 3 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 STEP(H, d, a, b, c, GET(8), 0x8771f681, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 STEP(H, b, c, d, a, GET(6), 0x04881d05, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
248
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 /* Round 4 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 STEP(I, a, b, c, d, GET(0), 0xf4292244, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 STEP(I, d, a, b, c, GET(7), 0x432aff97, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 STEP(I, c, d, a, b, GET(6), 0xa3014314, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
267
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 a += saved_a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 b += saved_b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 c += saved_c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271 d += saved_d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
272
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 p += 64;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 } while (size -= 64);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
276
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 ctx->a = a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278 ctx->b = b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 ctx->c = c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 ctx->d = d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
281
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 return p;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 }