COOLFluiD  Release kernel
COOLFluiD is a Collaborative Simulation Environment (CSE) focused on complex MultiPhysics simulations.
md5.c
Go to the documentation of this file.
1 #include <string.h>
2 
3 #include "md5.h"
4 
5 #define GET_UINT32(n, b, i) n = b[i] + (b[i+1]<<8) + (b[i+2]<<16) + (b[i+3]<<24)
6 #define PUT_UINT32(n, b, i) do { b[i] = n; b[i+1] = n >> 8; b[i+2] = n >> 16; b[i+3] = n >> 24; } while(0)
7 
8 void md5_starts(md5_context *ctx) {
9  ctx->total[0] = 0;
10  ctx->total[1] = 0;
11 
12  ctx->state[0] = 0x67452301;
13  ctx->state[1] = 0xEFCDAB89;
14  ctx->state[2] = 0x98BADCFE;
15  ctx->state[3] = 0x10325476;
16 }
17 
18 void md5_process(md5_context *ctx, const uint8_t data[64]) {
19  uint32_t X[16], A, B, C, D;
20 
21  GET_UINT32(X[0], data, 0);
22  GET_UINT32(X[1], data, 4);
23  GET_UINT32(X[2], data, 8);
24  GET_UINT32(X[3], data, 12);
25  GET_UINT32(X[4], data, 16);
26  GET_UINT32(X[5], data, 20);
27  GET_UINT32(X[6], data, 24);
28  GET_UINT32(X[7], data, 28);
29  GET_UINT32(X[8], data, 32);
30  GET_UINT32(X[9], data, 36);
31  GET_UINT32(X[10], data, 40);
32  GET_UINT32(X[11], data, 44);
33  GET_UINT32(X[12], data, 48);
34  GET_UINT32(X[13], data, 52);
35  GET_UINT32(X[14], data, 56);
36  GET_UINT32(X[15], data, 60);
37 
38 #define S(x, n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
39 
40 #define P(a, b, c, d, k, s, t) \
41  { \
42  a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
43  }
44 
45  A = ctx->state[0];
46  B = ctx->state[1];
47  C = ctx->state[2];
48  D = ctx->state[3];
49 
50 #define F(x, y, z) (z ^ (x & (y ^ z)))
51 
52  P(A, B, C, D, 0, 7, 0xD76AA478);
53  P(D, A, B, C, 1, 12, 0xE8C7B756);
54  P(C, D, A, B, 2, 17, 0x242070DB);
55  P(B, C, D, A, 3, 22, 0xC1BDCEEE);
56  P(A, B, C, D, 4, 7, 0xF57C0FAF);
57  P(D, A, B, C, 5, 12, 0x4787C62A);
58  P(C, D, A, B, 6, 17, 0xA8304613);
59  P(B, C, D, A, 7, 22, 0xFD469501);
60  P(A, B, C, D, 8, 7, 0x698098D8);
61  P(D, A, B, C, 9, 12, 0x8B44F7AF);
62  P(C, D, A, B, 10, 17, 0xFFFF5BB1);
63  P(B, C, D, A, 11, 22, 0x895CD7BE);
64  P(A, B, C, D, 12, 7, 0x6B901122);
65  P(D, A, B, C, 13, 12, 0xFD987193);
66  P(C, D, A, B, 14, 17, 0xA679438E);
67  P(B, C, D, A, 15, 22, 0x49B40821);
68 
69 #undef F
70 
71 #define F(x, y, z) (y ^ (z & (x ^ y)))
72 
73  P(A, B, C, D, 1, 5, 0xF61E2562);
74  P(D, A, B, C, 6, 9, 0xC040B340);
75  P(C, D, A, B, 11, 14, 0x265E5A51);
76  P(B, C, D, A, 0, 20, 0xE9B6C7AA);
77  P(A, B, C, D, 5, 5, 0xD62F105D);
78  P(D, A, B, C, 10, 9, 0x02441453);
79  P(C, D, A, B, 15, 14, 0xD8A1E681);
80  P(B, C, D, A, 4, 20, 0xE7D3FBC8);
81  P(A, B, C, D, 9, 5, 0x21E1CDE6);
82  P(D, A, B, C, 14, 9, 0xC33707D6);
83  P(C, D, A, B, 3, 14, 0xF4D50D87);
84  P(B, C, D, A, 8, 20, 0x455A14ED);
85  P(A, B, C, D, 13, 5, 0xA9E3E905);
86  P(D, A, B, C, 2, 9, 0xFCEFA3F8);
87  P(C, D, A, B, 7, 14, 0x676F02D9);
88  P(B, C, D, A, 12, 20, 0x8D2A4C8A);
89 
90 #undef F
91 
92 #define F(x, y, z) (x ^ y ^ z)
93 
94  P(A, B, C, D, 5, 4, 0xFFFA3942);
95  P(D, A, B, C, 8, 11, 0x8771F681);
96  P(C, D, A, B, 11, 16, 0x6D9D6122);
97  P(B, C, D, A, 14, 23, 0xFDE5380C);
98  P(A, B, C, D, 1, 4, 0xA4BEEA44);
99  P(D, A, B, C, 4, 11, 0x4BDECFA9);
100  P(C, D, A, B, 7, 16, 0xF6BB4B60);
101  P(B, C, D, A, 10, 23, 0xBEBFBC70);
102  P(A, B, C, D, 13, 4, 0x289B7EC6);
103  P(D, A, B, C, 0, 11, 0xEAA127FA);
104  P(C, D, A, B, 3, 16, 0xD4EF3085);
105  P(B, C, D, A, 6, 23, 0x04881D05);
106  P(A, B, C, D, 9, 4, 0xD9D4D039);
107  P(D, A, B, C, 12, 11, 0xE6DB99E5);
108  P(C, D, A, B, 15, 16, 0x1FA27CF8);
109  P(B, C, D, A, 2, 23, 0xC4AC5665);
110 
111 #undef F
112 
113 #define F(x, y, z) (y ^ (x | ~z))
114 
115  P(A, B, C, D, 0, 6, 0xF4292244);
116  P(D, A, B, C, 7, 10, 0x432AFF97);
117  P(C, D, A, B, 14, 15, 0xAB9423A7);
118  P(B, C, D, A, 5, 21, 0xFC93A039);
119  P(A, B, C, D, 12, 6, 0x655B59C3);
120  P(D, A, B, C, 3, 10, 0x8F0CCC92);
121  P(C, D, A, B, 10, 15, 0xFFEFF47D);
122  P(B, C, D, A, 1, 21, 0x85845DD1);
123  P(A, B, C, D, 8, 6, 0x6FA87E4F);
124  P(D, A, B, C, 15, 10, 0xFE2CE6E0);
125  P(C, D, A, B, 6, 15, 0xA3014314);
126  P(B, C, D, A, 13, 21, 0x4E0811A1);
127  P(A, B, C, D, 4, 6, 0xF7537E82);
128  P(D, A, B, C, 11, 10, 0xBD3AF235);
129  P(C, D, A, B, 2, 15, 0x2AD7D2BB);
130  P(B, C, D, A, 9, 21, 0xEB86D391);
131 
132 #undef F
133 
134  ctx->state[0] += A;
135  ctx->state[1] += B;
136  ctx->state[2] += C;
137  ctx->state[3] += D;
138 }
139 
140 void md5_update(md5_context *ctx, const uint8_t *input, uint32_t length) {
141  uint32_t left, fill;
142 
143  if (!length)
144  return;
145 
146  left = ctx->total[0] & 0x3F;
147  fill = 64 - left;
148 
149  ctx->total[0] += length;
150  ctx->total[0] &= 0xFFFFFFFF;
151 
152  if (ctx->total[0] < length)
153  ctx->total[1]++;
154 
155  if (left && length >= fill) {
156  memcpy((void *)(ctx->buffer + left), (const void *)input, fill);
157  md5_process(ctx, ctx->buffer);
158  length -= fill;
159  input += fill;
160  left = 0;
161  }
162 
163  while (length >= 64) {
164  md5_process(ctx, input);
165  length -= 64;
166  input += 64;
167  }
168 
169  if (length) {
170  memcpy((void *)(ctx->buffer + left), (const void *)input, length);
171  }
172 }
173 
174 const uint8_t md5_padding[64] = {
175  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
176  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
178  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
179 };
180 
181 void md5_finish(md5_context *ctx, uint8_t digest[16]) {
182  uint32_t last, padn;
183  uint32_t high, low;
184  uint8_t msglen[8];
185 
186  high = (ctx->total[0] >> 29) | (ctx->total[1] << 3);
187  low = (ctx->total[0] << 3);
188 
189  PUT_UINT32(low, msglen, 0);
190  PUT_UINT32(high, msglen, 4);
191 
192  last = ctx->total[0] & 0x3F;
193  padn = (last < 56) ? (56 - last) : (120 - last);
194 
195  md5_update(ctx, md5_padding, padn);
196  md5_update(ctx, msglen, 8);
197 
198  PUT_UINT32(ctx->state[0], digest, 0);
199  PUT_UINT32(ctx->state[1], digest, 4);
200  PUT_UINT32(ctx->state[2], digest, 8);
201  PUT_UINT32(ctx->state[3], digest, 12);
202 }
void md5_starts(md5_context *ctx)
Definition: md5.c:8
#define PUT_UINT32(n, b, i)
Definition: md5.c:6
uint32_t total[2]
Definition: md5.h:13
unsigned char uint8_t
Definition: stdint.h:78
unsigned int uint32_t
Definition: stdint.h:80
void md5_finish(md5_context *ctx, uint8_t digest[16])
Definition: md5.c:181
const uint8_t md5_padding[64]
Definition: md5.c:174
void fill(NodeValuesT &to_fill, const common::Table< Real > &data_array, const RowT &element_row, const Uint start=0)
Fill STL-vector like per-node data storage.
Definition: ElementData.hpp:28
uint8_t buffer[64]
Definition: md5.h:15
uint32_t state[4]
Definition: md5.h:14
#define P(a, b, c, d, k, s, t)
void md5_update(md5_context *ctx, const uint8_t *input, uint32_t length)
Definition: md5.c:140
#define GET_UINT32(n, b, i)
Definition: md5.c:5
void md5_process(md5_context *ctx, const uint8_t data[64])
Definition: md5.c:18
Send comments to:
COOLFluiD Web Admin