digest-m4p 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ /* -*- C -*-
2
+ * $Id: defs.h 62 2006-04-06 17:50:02Z aaronp $
3
+ */
4
+
5
+ #ifndef DEFS_H
6
+ #define DEFS_H
7
+
8
+ #include "ruby.h"
9
+ #include <sys/types.h>
10
+
11
+ #if defined(HAVE_SYS_CDEFS_H)
12
+ # include <sys/cdefs.h>
13
+ #endif
14
+ #if !defined(__BEGIN_DECLS)
15
+ # define __BEGIN_DECLS
16
+ # define __END_DECLS
17
+ #endif
18
+
19
+ #if defined(HAVE_INTTYPES_H)
20
+ # include <inttypes.h>
21
+ #elif !defined __CYGWIN__ || !defined __uint8_t_defined
22
+ typedef unsigned char uint8_t;
23
+ typedef unsigned int uint32_t;
24
+ # if SIZEOF_LONG == 8
25
+ typedef unsigned long uint64_t;
26
+ # elif defined(__GNUC__)
27
+ typedef unsigned long long uint64_t;
28
+ # elif defined(_MSC_VER)
29
+ typedef unsigned _int64 uint64_t;
30
+ # elif defined(__BORLANDC__)
31
+ typedef unsigned __int64 uint64_t;
32
+ # else
33
+ # define NO_UINT64_T
34
+ # endif
35
+ #endif
36
+
37
+ #endif /* DEFS_H */
@@ -0,0 +1,6 @@
1
+ md5.o: md5.c md5.h $(srcdir)/defs.h $(hdrdir)/ruby.h $(topdir)/config.h \
2
+ $(hdrdir)/defines.h $(hdrdir)/intern.h
3
+ md5init.o: md5init.c $(srcdir)/digest.h $(hdrdir)/ruby.h \
4
+ $(topdir)/config.h $(hdrdir)/defines.h $(hdrdir)/intern.h md5.h \
5
+ $(srcdir)/defs.h
6
+ md5ossl.o: md5ossl.h
@@ -0,0 +1,32 @@
1
+ /************************************************
2
+
3
+ digest.c -
4
+
5
+ $Author: aaronp $
6
+ created at: Fri May 25 08:54:56 JST 2001
7
+
8
+
9
+ Copyright (C) 2001 Akinori MUSHA
10
+
11
+ $RoughId: digest.h,v 1.3 2001/07/13 15:38:27 knu Exp $
12
+ $Id: digest.h 62 2006-04-06 17:50:02Z aaronp $
13
+
14
+ ************************************************/
15
+
16
+ #include "ruby.h"
17
+
18
+ typedef void (*hash_init_func_t) _((void *));
19
+ typedef void (*hash_update_func_t) _((void *, unsigned char *, size_t));
20
+ typedef void (*hash_end_func_t) _((void *, unsigned char *));
21
+ typedef void (*hash_final_func_t) _((unsigned char *, void *));
22
+ typedef int (*hash_equal_func_t) _((void *, void *));
23
+
24
+ typedef struct {
25
+ size_t digest_len;
26
+ size_t ctx_size;
27
+ hash_init_func_t init_func;
28
+ hash_update_func_t update_func;
29
+ hash_end_func_t end_func;
30
+ hash_final_func_t final_func;
31
+ hash_equal_func_t equal_func;
32
+ } algo_t;
@@ -0,0 +1,22 @@
1
+ # $RoughId: extconf.rb,v 1.3 2001/08/14 19:54:51 knu Exp $
2
+ # $Id: extconf.rb 62 2006-04-06 17:50:02Z aaronp $
3
+
4
+ require "mkmf"
5
+
6
+ $CFLAGS << " -DHAVE_CONFIG_H -I#{File.dirname(__FILE__)}/.."
7
+
8
+ $objs = [ "md5init.#{$OBJEXT}" ]
9
+
10
+ $objs << "md5.#{$OBJEXT}"
11
+
12
+ have_header("sys/cdefs.h")
13
+
14
+ have_header("inttypes.h")
15
+
16
+ have_header("unistd.h")
17
+
18
+ if [1].pack("I") == [1].pack("N")
19
+ $CFLAGS += " -DWORDS_BIGENDIAN"
20
+ end
21
+
22
+ create_makefile("digest/m4p")
@@ -0,0 +1,432 @@
1
+ /*
2
+ Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
3
+
4
+ This software is provided 'as-is', without any express or implied
5
+ warranty. In no event will the authors be held liable for any damages
6
+ arising from the use of this software.
7
+
8
+ Permission is granted to anyone to use this software for any purpose,
9
+ including commercial applications, and to alter it and redistribute it
10
+ freely, subject to the following restrictions:
11
+
12
+ 1. The origin of this software must not be misrepresented; you must not
13
+ claim that you wrote the original software. If you use this software
14
+ in a product, an acknowledgment in the product documentation would be
15
+ appreciated but is not required.
16
+ 2. Altered source versions must be plainly marked as such, and must not be
17
+ misrepresented as being the original software.
18
+ 3. This notice may not be removed or altered from any source distribution.
19
+
20
+ L. Peter Deutsch
21
+ ghost@aladdin.com
22
+
23
+ */
24
+
25
+ /*
26
+ Independent implementation of MD5 (RFC 1321).
27
+
28
+ This code implements the MD5 Algorithm defined in RFC 1321.
29
+ It is derived directly from the text of the RFC and not from the
30
+ reference implementation.
31
+
32
+ The original and principal author of md5.c is L. Peter Deutsch
33
+ <ghost@aladdin.com>. Other authors are noted in the change history
34
+ that follows (in reverse chronological order):
35
+
36
+ 2000-07-03 lpd Patched to eliminate warnings about "constant is
37
+ unsigned in ANSI C, signed in traditional";
38
+ made test program self-checking.
39
+ 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
40
+ 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
41
+ 1999-05-03 lpd Original version.
42
+ */
43
+
44
+ /*$OrigId: md5c.c,v 1.2 2001/03/26 08:57:14 matz Exp $ */
45
+ /*$RoughId: md5.c,v 1.2 2001/07/13 19:48:41 knu Exp $ */
46
+ /*$Id: md5.c 62 2006-04-06 17:50:02Z aaronp $ */
47
+
48
+ #include "md5.h"
49
+
50
+ #ifdef TEST
51
+ /*
52
+ * Compile with -DTEST to create a self-contained executable test program.
53
+ * The test program should print out the same values as given in section
54
+ * A.5 of RFC 1321, reproduced below.
55
+ */
56
+ #include <string.h>
57
+ main()
58
+ {
59
+ static const char *const test[7*2] = {
60
+ "", "d41d8cd98f00b204e9800998ecf8427e",
61
+ "a", "0cc175b9c0f1b6a831c399e269772661",
62
+ "abc", "900150983cd24fb0d6963f7d28e17f72",
63
+ "message digest", "f96b697d7cb7938d525a2f31aaf161d0",
64
+ "abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b",
65
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
66
+ "d174ab98d277d9f5a5611c2c9f419d9f",
67
+ "12345678901234567890123456789012345678901234567890123456789012345678901234567890", "57edf4a22be3c955ac49da2e2107b67a"
68
+ };
69
+ int i;
70
+
71
+ for (i = 0; i < 7*2; i += 2) {
72
+ MD5_CTX state;
73
+ uint8_t digest[16];
74
+ char hex_output[16*2 + 1];
75
+ int di;
76
+
77
+ MD5_Init(&state);
78
+ MD5_Update(&state, (const uint8_t *)test[i], strlen(test[i]));
79
+ MD5_Final(digest, &state);
80
+ printf("MD5 (\"%s\") = ", test[i]);
81
+ for (di = 0; di < 16; ++di)
82
+ sprintf(hex_output + di * 2, "%02x", digest[di]);
83
+ puts(hex_output);
84
+ if (strcmp(hex_output, test[i + 1]))
85
+ printf("**** ERROR, should be: %s\n", test[i + 1]);
86
+ }
87
+ return 0;
88
+ }
89
+ #endif /* TEST */
90
+
91
+
92
+ /*
93
+ * For reference, here is the program that computed the T values.
94
+ */
95
+ #ifdef COMPUTE_T_VALUES
96
+ #include <math.h>
97
+ main()
98
+ {
99
+ int i;
100
+ for (i = 1; i <= 64; ++i) {
101
+ unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
102
+
103
+ /*
104
+ * The following nonsense is only to avoid compiler warnings about
105
+ * "integer constant is unsigned in ANSI C, signed with -traditional".
106
+ */
107
+ if (v >> 31) {
108
+ printf("#define T%d /* 0x%08lx */ (T_MASK ^ 0x%08lx)\n", i,
109
+ v, (unsigned long)(unsigned int)(~v));
110
+ } else {
111
+ printf("#define T%d 0x%08lx\n", i, v);
112
+ }
113
+ }
114
+ return 0;
115
+ }
116
+ #endif /* COMPUTE_T_VALUES */
117
+ /*
118
+ * End of T computation program.
119
+ */
120
+ #ifdef T_MASK
121
+ #undef T_MASK
122
+ #endif
123
+ #define T_MASK ((uint32_t)~0)
124
+ #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
125
+ #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
126
+ #define T3 0x242070db
127
+ #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
128
+ #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
129
+ #define T6 0x4787c62a
130
+ #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
131
+ #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
132
+ #define T9 0x698098d8
133
+ #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
134
+ #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
135
+ #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
136
+ #define T13 0x6b901122
137
+ #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
138
+ #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
139
+ #define T16 0x49b40821
140
+ #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
141
+ #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
142
+ #define T19 0x265e5a51
143
+ #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
144
+ #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
145
+ #define T22 0x02441453
146
+ #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
147
+ #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
148
+ #define T25 0x21e1cde6
149
+ #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
150
+ #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
151
+ #define T28 0x445a14ed
152
+ #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
153
+ #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
154
+ #define T31 0x676f02d9
155
+ #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
156
+ #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
157
+ #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
158
+ #define T35 0x6d9d6122
159
+ #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
160
+ #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
161
+ #define T38 0x4bdecfa9
162
+ #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
163
+ #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
164
+ #define T41 0x289b7ec6
165
+ #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
166
+ #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
167
+ #define T44 0x04881d05
168
+ #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
169
+ #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
170
+ #define T47 0x1fa27cf8
171
+ #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
172
+ #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
173
+ #define T50 0x432aff97
174
+ #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
175
+ #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
176
+ #define T53 0x655b59c3
177
+ #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
178
+ #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
179
+ #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
180
+ #define T57 0x6fa87e4f
181
+ #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
182
+ #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
183
+ #define T60 0x4e0811a1
184
+ #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
185
+ #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
186
+ #define T63 0x2ad7d2bb
187
+ #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
188
+
189
+
190
+ static void
191
+ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/)
192
+ {
193
+ uint32_t
194
+ a = pms->state[0], b = pms->state[1],
195
+ c = pms->state[2], d = pms->state[3];
196
+ uint32_t t;
197
+
198
+ #ifdef WORDS_BIGENDIAN
199
+
200
+ /*
201
+ * On big-endian machines, we must arrange the bytes in the right
202
+ * order. (This also works on machines of unknown byte order.)
203
+ */
204
+ uint32_t X[16];
205
+ const uint8_t *xp = data;
206
+ int i;
207
+
208
+ for (i = 0; i < 16; ++i, xp += 4)
209
+ X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
210
+
211
+ #else
212
+
213
+ /*
214
+ * On little-endian machines, we can process properly aligned data
215
+ * without copying it.
216
+ */
217
+ uint32_t xbuf[16];
218
+ const uint32_t *X;
219
+
220
+ if (!((data - (const uint8_t *)0) & 3)) {
221
+ /* data are properly aligned */
222
+ X = (const uint32_t *)data;
223
+ } else {
224
+ /* not aligned */
225
+ memcpy(xbuf, data, 64);
226
+ X = xbuf;
227
+ }
228
+ #endif
229
+
230
+ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
231
+
232
+ /* Round 1. */
233
+ /* Let [abcd k s i] denote the operation
234
+ a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
235
+ #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
236
+ #define SET(a, b, c, d, k, s, Ti)\
237
+ t = a + F(b,c,d) + X[k] + Ti;\
238
+ a = ROTATE_LEFT(t, s) + b
239
+ /* Do the following 16 operations. */
240
+ SET(a, b, c, d, 0, 7, T1);
241
+ SET(d, a, b, c, 1, 12, T2);
242
+ SET(c, d, a, b, 2, 17, T3);
243
+ SET(b, c, d, a, 3, 22, T4);
244
+ SET(a, b, c, d, 4, 7, T5);
245
+ SET(d, a, b, c, 5, 12, T6);
246
+ SET(c, d, a, b, 6, 17, T7);
247
+ SET(b, c, d, a, 7, 22, T8);
248
+ SET(a, b, c, d, 8, 7, T9);
249
+ SET(d, a, b, c, 9, 12, T10);
250
+ SET(c, d, a, b, 10, 17, T11);
251
+ SET(b, c, d, a, 11, 22, T12);
252
+ SET(a, b, c, d, 12, 7, T13);
253
+ SET(d, a, b, c, 13, 12, T14);
254
+ SET(c, d, a, b, 14, 17, T15);
255
+ SET(b, c, d, a, 15, 22, T16);
256
+ #undef SET
257
+
258
+ /* Round 2. */
259
+ /* Let [abcd k s i] denote the operation
260
+ a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
261
+ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
262
+ #define SET(a, b, c, d, k, s, Ti)\
263
+ t = a + G(b,c,d) + X[k] + Ti;\
264
+ a = ROTATE_LEFT(t, s) + b
265
+ /* Do the following 16 operations. */
266
+ SET(a, b, c, d, 1, 5, T17);
267
+ SET(d, a, b, c, 6, 9, T18);
268
+ SET(c, d, a, b, 11, 14, T19);
269
+ SET(b, c, d, a, 0, 20, T20);
270
+ SET(a, b, c, d, 5, 5, T21);
271
+ SET(d, a, b, c, 10, 9, T22);
272
+ SET(c, d, a, b, 15, 14, T23);
273
+ SET(b, c, d, a, 4, 20, T24);
274
+ SET(a, b, c, d, 9, 5, T25);
275
+ SET(d, a, b, c, 14, 9, T26);
276
+ SET(c, d, a, b, 3, 14, T27);
277
+ SET(b, c, d, a, 8, 20, T28);
278
+ SET(a, b, c, d, 13, 5, T29);
279
+ SET(d, a, b, c, 2, 9, T30);
280
+ SET(c, d, a, b, 7, 14, T31);
281
+ SET(b, c, d, a, 12, 20, T32);
282
+ #undef SET
283
+
284
+ /* Round 3. */
285
+ /* Let [abcd k s t] denote the operation
286
+ a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
287
+ #define H(x, y, z) ((x) ^ (y) ^ (z))
288
+ #define SET(a, b, c, d, k, s, Ti)\
289
+ t = a + H(b,c,d) + X[k] + Ti;\
290
+ a = ROTATE_LEFT(t, s) + b
291
+ /* Do the following 16 operations. */
292
+ SET(a, b, c, d, 5, 4, T33);
293
+ SET(d, a, b, c, 8, 11, T34);
294
+ SET(c, d, a, b, 11, 16, T35);
295
+ SET(b, c, d, a, 14, 23, T36);
296
+ SET(a, b, c, d, 1, 4, T37);
297
+ SET(d, a, b, c, 4, 11, T38);
298
+ SET(c, d, a, b, 7, 16, T39);
299
+ SET(b, c, d, a, 10, 23, T40);
300
+ SET(a, b, c, d, 13, 4, T41);
301
+ SET(d, a, b, c, 0, 11, T42);
302
+ SET(c, d, a, b, 3, 16, T43);
303
+ SET(b, c, d, a, 6, 23, T44);
304
+ SET(a, b, c, d, 9, 4, T45);
305
+ SET(d, a, b, c, 12, 11, T46);
306
+ SET(c, d, a, b, 15, 16, T47);
307
+ SET(b, c, d, a, 2, 23, T48);
308
+ #undef SET
309
+
310
+ /* Round 4. */
311
+ /* Let [abcd k s t] denote the operation
312
+ a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
313
+ #define I(x, y, z) ((y) ^ ((x) | ~(z)))
314
+ #define SET(a, b, c, d, k, s, Ti)\
315
+ t = a + I(b,c,d) + X[k] + Ti;\
316
+ a = ROTATE_LEFT(t, s) + b
317
+ /* Do the following 16 operations. */
318
+ SET(a, b, c, d, 0, 6, T49);
319
+ SET(d, a, b, c, 7, 10, T50);
320
+ SET(c, d, a, b, 14, 15, T51);
321
+ SET(b, c, d, a, 5, 21, T52);
322
+ SET(a, b, c, d, 12, 6, T53);
323
+ SET(d, a, b, c, 3, 10, T54);
324
+ SET(c, d, a, b, 10, 15, T55);
325
+ SET(b, c, d, a, 1, 21, T56);
326
+ SET(a, b, c, d, 8, 6, T57);
327
+ SET(d, a, b, c, 15, 10, T58);
328
+ SET(c, d, a, b, 6, 15, T59);
329
+ SET(b, c, d, a, 13, 21, T60);
330
+ SET(a, b, c, d, 4, 6, T61);
331
+ SET(d, a, b, c, 11, 10, T62);
332
+ SET(c, d, a, b, 2, 15, T63);
333
+ SET(b, c, d, a, 9, 21, T64);
334
+ #undef SET
335
+
336
+ /* Then perform the following additions. (That is increment each
337
+ of the four registers by the value it had before this block
338
+ was started.) */
339
+ pms->state[0] += a;
340
+ pms->state[1] += b;
341
+ pms->state[2] += c;
342
+ pms->state[3] += d;
343
+ }
344
+
345
+ void
346
+ MD5_Init(MD5_CTX *pms)
347
+ {
348
+ pms->count[0] = pms->count[1] = 0;
349
+ pms->state[0] = 0x67452301;
350
+ pms->state[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
351
+ pms->state[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
352
+ pms->state[3] = 0x10325476;
353
+ }
354
+
355
+ void
356
+ MD5_Update(MD5_CTX *pms, const uint8_t *data, size_t nbytes)
357
+ {
358
+ const uint8_t *p = data;
359
+ size_t left = nbytes;
360
+ size_t offset = (pms->count[0] >> 3) & 63;
361
+ uint32_t nbits = (uint32_t)(nbytes << 3);
362
+
363
+ if (nbytes <= 0)
364
+ return;
365
+
366
+ /* Update the message length. */
367
+ pms->count[1] += nbytes >> 29;
368
+ pms->count[0] += nbits;
369
+ if (pms->count[0] < nbits)
370
+ pms->count[1]++;
371
+
372
+ /* Process an initial partial block. */
373
+ if (offset) {
374
+ size_t copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
375
+
376
+ memcpy(pms->buffer + offset, p, copy);
377
+ if (offset + copy < 64)
378
+ return;
379
+ p += copy;
380
+ left -= copy;
381
+ md5_process(pms, pms->buffer);
382
+ }
383
+
384
+ /* Process full blocks. */
385
+ for (; left >= 64; p += 64, left -= 64)
386
+ md5_process(pms, p);
387
+
388
+ /* Process a final partial block. */
389
+ if (left)
390
+ memcpy(pms->buffer, p, left);
391
+ }
392
+
393
+ void
394
+ MD5_Final(uint8_t *digest, MD5_CTX *pms)
395
+ {
396
+ static const uint8_t pad[64] = {
397
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
398
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
399
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
400
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
401
+ };
402
+ uint8_t data[8];
403
+ size_t i;
404
+
405
+ /* Save the length before padding. */
406
+ for (i = 0; i < 8; ++i)
407
+ data[i] = (uint8_t)(pms->count[i >> 2] >> ((i & 3) << 3));
408
+ /* Pad to 56 bytes mod 64. */
409
+ MD5_Update(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
410
+ /* Append the length. */
411
+ MD5_Update(pms, data, 8);
412
+ for (i = 0; i < 16; ++i)
413
+ digest[i] = (uint8_t)(pms->state[i >> 2] >> ((i & 3) << 3));
414
+ }
415
+
416
+ void
417
+ MD5_End(MD5_CTX *pctx, uint8_t *hexdigest)
418
+ {
419
+ unsigned char digest[16];
420
+ size_t i;
421
+
422
+ MD5_Final(digest, pctx);
423
+
424
+ for (i = 0; i < 16; i++)
425
+ sprintf(hexdigest + i * 2, "%02x", digest[i]);
426
+ }
427
+
428
+ int MD5_Equal(MD5_CTX* pctx1, MD5_CTX* pctx2) {
429
+ return memcmp(pctx1->count, pctx2->count, sizeof(pctx1->count)) == 0
430
+ && memcmp(pctx1->state, pctx2->state, sizeof(pctx1->state)) == 0
431
+ && memcmp(pctx1->buffer, pctx2->buffer, sizeof(pctx1->buffer)) == 0;
432
+ }
@@ -0,0 +1,83 @@
1
+ /*
2
+ Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
3
+
4
+ This software is provided 'as-is', without any express or implied
5
+ warranty. In no event will the authors be held liable for any damages
6
+ arising from the use of this software.
7
+
8
+ Permission is granted to anyone to use this software for any purpose,
9
+ including commercial applications, and to alter it and redistribute it
10
+ freely, subject to the following restrictions:
11
+
12
+ 1. The origin of this software must not be misrepresented; you must not
13
+ claim that you wrote the original software. If you use this software
14
+ in a product, an acknowledgment in the product documentation would be
15
+ appreciated but is not required.
16
+ 2. Altered source versions must be plainly marked as such, and must not be
17
+ misrepresented as being the original software.
18
+ 3. This notice may not be removed or altered from any source distribution.
19
+
20
+ L. Peter Deutsch
21
+ ghost@aladdin.com
22
+
23
+ */
24
+ /*
25
+ Independent implementation of MD5 (RFC 1321).
26
+
27
+ This code implements the MD5 Algorithm defined in RFC 1321.
28
+ It is derived directly from the text of the RFC and not from the
29
+ reference implementation.
30
+
31
+ The original and principal author of md5.h is L. Peter Deutsch
32
+ <ghost@aladdin.com>. Other authors are noted in the change history
33
+ that follows (in reverse chronological order):
34
+
35
+ 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
36
+ 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
37
+ added conditionalization for C++ compilation from Martin
38
+ Purschke <purschke@bnl.gov>.
39
+ 1999-05-03 lpd Original version.
40
+ */
41
+
42
+ /* $OrigId: md5.h,v 1.2 2001/03/26 08:57:14 matz Exp $ */
43
+ /* $RoughId: md5.h,v 1.3 2002/02/24 08:14:31 knu Exp $ */
44
+ /* $Id: md5.h 62 2006-04-06 17:50:02Z aaronp $ */
45
+
46
+ #ifndef MD5_INCLUDED
47
+ # define MD5_INCLUDED
48
+
49
+ #include "defs.h"
50
+
51
+ /*
52
+ * This code has some adaptations for the Ghostscript environment, but it
53
+ * will compile and run correctly in any environment with 8-bit chars and
54
+ * 32-bit ints. Specifically, it assumes that if the following are
55
+ * defined, they have the same meaning as in Ghostscript: P1, P2, P3.
56
+ */
57
+
58
+ /* Define the state of the MD5 Algorithm. */
59
+ typedef struct md5_state_s {
60
+ uint32_t count[2]; /* message length in bits, lsw first */
61
+ uint32_t state[4]; /* digest buffer */
62
+ uint8_t buffer[64]; /* accumulate block */
63
+ } MD5_CTX;
64
+
65
+ #ifdef RUBY
66
+ #define MD5_Init rb_Digest_MD5_Init
67
+ #define MD5_Update rb_Digest_MD5_Update
68
+ #define MD5_Final rb_Digest_MD5_Final
69
+ #define MD5_End rb_Digest_MD5_End
70
+ #define MD5_Equal rb_Digest_MD5_Equal
71
+ #endif
72
+
73
+ void MD5_Init _((MD5_CTX *pms));
74
+ void MD5_Update _((MD5_CTX *pms, const uint8_t *data, size_t nbytes));
75
+ void MD5_Final _((uint8_t *digest, MD5_CTX *pms));
76
+ void MD5_End _((MD5_CTX *pctx, uint8_t *hexdigest));
77
+ int MD5_Equal _((MD5_CTX *pctx1, MD5_CTX *pctx2));
78
+
79
+ #define MD5_BLOCK_LENGTH 64
80
+ #define MD5_DIGEST_LENGTH 16
81
+ #define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1)
82
+
83
+ #endif /* MD5_INCLUDED */
@@ -0,0 +1,31 @@
1
+ /* $RoughId: md5init.c,v 1.2 2001/07/13 19:49:10 knu Exp $ */
2
+ /* $Id: md5init.c 62 2006-04-06 17:50:02Z aaronp $ */
3
+
4
+ #include "digest.h"
5
+ #include "md5.h"
6
+
7
+ static algo_t md5 = {
8
+ MD5_DIGEST_LENGTH,
9
+ sizeof(MD5_CTX),
10
+ (hash_init_func_t)MD5_Init,
11
+ (hash_update_func_t)MD5_Update,
12
+ (hash_end_func_t)MD5_End,
13
+ (hash_final_func_t)MD5_Final,
14
+ (hash_equal_func_t)MD5_Equal,
15
+ };
16
+
17
+ void
18
+ Init_m4p()
19
+ {
20
+ VALUE mDigest, cDigest_Base, cDigest_MD5;
21
+
22
+ rb_require("digest.so");
23
+
24
+ mDigest = rb_path2class("Digest");
25
+ cDigest_Base = rb_path2class("Digest::Base");
26
+
27
+ cDigest_MD5 = rb_define_class_under(mDigest, "M4P", cDigest_Base);
28
+
29
+ rb_cvar_set(cDigest_MD5, rb_intern("metadata"),
30
+ Data_Wrap_Struct(rb_cObject, 0, 0, &md5), Qtrue);
31
+ }
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: digest-m4p
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.2
7
+ date: 2006-07-09 00:00:00 -07:00
8
+ summary: iTunes specific digest encoding
9
+ require_paths:
10
+ - lib
11
+ email: aaronp@rubyforge.org
12
+ homepage: daapclient.rubyforge.org
13
+ rubyforge_project: daapclient
14
+ description:
15
+ autorequire: digest/m4p
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ -
22
+ - ">"
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.0
25
+ version:
26
+ platform: ruby
27
+ signing_key:
28
+ cert_chain:
29
+ post_install_message:
30
+ authors:
31
+ - Aaron Patterson
32
+ files:
33
+ - ext/defs.h
34
+ - ext/depend
35
+ - ext/digest.h
36
+ - ext/extconf.rb
37
+ - ext/md5.c
38
+ - ext/md5.h
39
+ - ext/md5init.c
40
+ test_files: []
41
+ rdoc_options: []
42
+ extra_rdoc_files: []
43
+ executables: []
44
+ extensions:
45
+ - ext/extconf.rb
46
+ requirements: []
47
+ dependencies: []