annotate src/core/ngx_md5.c @ 5360:3d2d3e1cf427

Win32: MinGW GCC compatibility. Several warnings silenced, notably (ngx_socket_t) -1 is now checked on socket operations instead of -1, as ngx_socket_t is unsigned on win32 and gcc complains on comparison. With this patch, it's now possible to compile nginx using mingw gcc, with options we normally compile on win32.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 04 Sep 2013 20:48:28 +0400
parents 21167183825d
children 9eefb38f0005
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 * It is not expected to be optimal and is used only
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 * if no MD5 implementation was found in system.
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11 #include <ngx_config.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12 #include <ngx_core.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
13 #include <ngx_md5.h>
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
15
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
16 #if !(NGX_HAVE_MD5)
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 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
19 size_t size);
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 void
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
23 ngx_md5_init(ngx_md5_t *ctx)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25 ctx->a = 0x67452301;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 ctx->b = 0xefcdab89;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
27 ctx->c = 0x98badcfe;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
28 ctx->d = 0x10325476;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
29
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30 ctx->bytes = 0;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31 }
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
34 void
3927
38e6f45c5e3d make built-in ngx_md5_update() interface consistent with other implemenations
Igor Sysoev <igor@sysoev.ru>
parents: 3900
diff changeset
35 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
36 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
37 size_t used, free;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
38
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
39 used = (size_t) (ctx->bytes & 0x3f);
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 ctx->bytes += size;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
41
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 if (used) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 free = 64 - used;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
44
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 if (size < free) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 ngx_memcpy(&ctx->buffer[used], data, size);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 return;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
49
4279
21167183825d Reverted incorrect change in internal md5 (part of r3928).
Maxim Dounin <mdounin@mdounin.ru>
parents: 3941
diff changeset
50 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
51 data = (u_char *) data + free;
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
52 size -= free;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 (void) ngx_md5_body(ctx, ctx->buffer, 64);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
55
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 if (size >= 64) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 data = ngx_md5_body(ctx, data, size & ~(size_t) 0x3f);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 size &= 0x3f;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
60
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 ngx_memcpy(ctx->buffer, data, size);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 }
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 void
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
66 ngx_md5_final(u_char result[16], ngx_md5_t *ctx)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 size_t used, free;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
69
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
70 used = (size_t) (ctx->bytes & 0x3f);
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 ctx->buffer[used++] = 0x80;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
73
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 free = 64 - used;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
75
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 if (free < 8) {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 ngx_memzero(&ctx->buffer[used], free);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 (void) ngx_md5_body(ctx, ctx->buffer, 64);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 used = 0;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 free = 64;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 }
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
82
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_memzero(&ctx->buffer[used], free - 8);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
84
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 ctx->bytes <<= 3;
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
86 ctx->buffer[56] = (u_char) ctx->bytes;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
87 ctx->buffer[57] = (u_char) (ctx->bytes >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
88 ctx->buffer[58] = (u_char) (ctx->bytes >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
89 ctx->buffer[59] = (u_char) (ctx->bytes >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
90 ctx->buffer[60] = (u_char) (ctx->bytes >> 32);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
91 ctx->buffer[61] = (u_char) (ctx->bytes >> 40);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
92 ctx->buffer[62] = (u_char) (ctx->bytes >> 48);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
93 ctx->buffer[63] = (u_char) (ctx->bytes >> 56);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
94
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 (void) ngx_md5_body(ctx, ctx->buffer, 64);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
96
3941
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
97 result[0] = (u_char) ctx->a;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
98 result[1] = (u_char) (ctx->a >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
99 result[2] = (u_char) (ctx->a >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
100 result[3] = (u_char) (ctx->a >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
101 result[4] = (u_char) ctx->b;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
102 result[5] = (u_char) (ctx->b >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
103 result[6] = (u_char) (ctx->b >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
104 result[7] = (u_char) (ctx->b >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
105 result[8] = (u_char) ctx->c;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
106 result[9] = (u_char) (ctx->c >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
107 result[10] = (u_char) (ctx->c >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
108 result[11] = (u_char) (ctx->c >> 24);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
109 result[12] = (u_char) ctx->d;
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
110 result[13] = (u_char) (ctx->d >> 8);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
111 result[14] = (u_char) (ctx->d >> 16);
ce1ba4a312d7 fix building by MSVC
Igor Sysoev <igor@sysoev.ru>
parents: 3927
diff changeset
112 result[15] = (u_char) (ctx->d >> 24);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
113
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 ngx_memzero(ctx, sizeof(*ctx));
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 }
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 * The basic MD5 functions.
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 * 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
122 * architectures that lack an AND-NOT instruction, just like in
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 * Colin Plumb's implementation.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127 #define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 #define H(x, y, z) ((x) ^ (y) ^ (z))
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
130
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 * The MD5 transformation for all four rounds.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 #define STEP(f, a, b, c, d, x, t, s) \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 (a) += f((b), (c), (d)) + (x) + (t); \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 (a) += (b)
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
139
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 /*
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 * 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
142 * in a properly aligned word in host byte order.
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 * The check for little-endian architectures that tolerate unaligned
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 * memory accesses is just an optimization. Nothing will break if it
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 * does not work.
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 #define SET(n) (*(uint32_t *) &p[n * 4])
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 #define GET(n) (*(uint32_t *) &p[n * 4])
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 #else
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 #define SET(n) \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 (block[n] = \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 (uint32_t) p[n * 4] | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 ((uint32_t) p[n * 4 + 1] << 8) | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 ((uint32_t) p[n * 4 + 2] << 16) | \
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ((uint32_t) p[n * 4 + 3] << 24))
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 #define GET(n) block[n]
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 #endif
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
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 * 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
170 * the bit counters. There are no alignment requirements.
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
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 static const u_char *
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 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
175 {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 uint32_t a, b, c, d;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 uint32_t saved_a, saved_b, saved_c, saved_d;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 const u_char *p;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 #if !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 uint32_t block[16];
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 #endif
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
182
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 p = data;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
184
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 a = ctx->a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 b = ctx->b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 c = ctx->c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 d = ctx->d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
189
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 do {
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 saved_a = a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 saved_b = b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193 saved_c = c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 saved_d = d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
195
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 /* Round 1 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 STEP(F, c, d, a, b, SET(2), 0x242070db, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 STEP(F, c, d, a, b, SET(6), 0xa8304613, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
205 STEP(F, b, c, d, a, SET(7), 0xfd469501, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
206 STEP(F, a, b, c, d, SET(8), 0x698098d8, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
208 STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
210 STEP(F, a, b, c, d, SET(12), 0x6b901122, 7);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 STEP(F, d, a, b, c, SET(13), 0xfd987193, 12);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
212 STEP(F, c, d, a, b, SET(14), 0xa679438e, 17);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 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
214
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 /* Round 2 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 STEP(G, d, a, b, c, GET(6), 0xc040b340, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
220 STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 STEP(G, d, a, b, c, GET(10), 0x02441453, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
224 STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
232 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
233
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 /* Round 3 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 STEP(H, d, a, b, c, GET(8), 0x8771f681, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 STEP(H, b, c, d, a, GET(6), 0x04881d05, 23);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 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
252
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 /* Round 4 */
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 STEP(I, a, b, c, d, GET(0), 0xf4292244, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 STEP(I, d, a, b, c, GET(7), 0x432aff97, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 STEP(I, c, d, a, b, GET(6), 0xa3014314, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15);
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 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
271
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
272 a += saved_a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 b += saved_b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 c += saved_c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 d += saved_d;
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 p += 64;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
278
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 } while (size -= 64);
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
280
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 ctx->a = a;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 ctx->b = b;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 ctx->c = c;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
284 ctx->d = d;
3900
4d5754e2f220 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 3895
diff changeset
285
3895
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 return p;
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 }
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
b659514a3948 an internal MD5 implemenation
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 #endif