Commit bc0b96b54a21246e377122d54569eef71cec535f

Authored by David S. Miller
1 parent de96355c11

crypto: Move md5_transform to lib/md5.c

We are going to use this for TCP/IP sequence number and fragment ID
generation.

Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 4 changed files with 102 additions and 92 deletions Side-by-side Diff

... ... @@ -21,98 +21,8 @@
21 21 #include <linux/module.h>
22 22 #include <linux/string.h>
23 23 #include <linux/types.h>
  24 +#include <linux/cryptohash.h>
24 25 #include <asm/byteorder.h>
25   -
26   -#define F1(x, y, z) (z ^ (x & (y ^ z)))
27   -#define F2(x, y, z) F1(z, x, y)
28   -#define F3(x, y, z) (x ^ y ^ z)
29   -#define F4(x, y, z) (y ^ (x | ~z))
30   -
31   -#define MD5STEP(f, w, x, y, z, in, s) \
32   - (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x)
33   -
34   -static void md5_transform(u32 *hash, u32 const *in)
35   -{
36   - u32 a, b, c, d;
37   -
38   - a = hash[0];
39   - b = hash[1];
40   - c = hash[2];
41   - d = hash[3];
42   -
43   - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
44   - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
45   - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
46   - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
47   - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
48   - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
49   - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
50   - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
51   - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
52   - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
53   - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
54   - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
55   - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
56   - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
57   - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
58   - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
59   -
60   - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
61   - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
62   - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
63   - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
64   - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
65   - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
66   - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
67   - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
68   - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
69   - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
70   - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
71   - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
72   - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
73   - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
74   - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
75   - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
76   -
77   - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
78   - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
79   - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
80   - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
81   - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
82   - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
83   - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
84   - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
85   - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
86   - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
87   - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
88   - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
89   - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
90   - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
91   - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
92   - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
93   -
94   - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
95   - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
96   - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
97   - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
98   - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
99   - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
100   - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
101   - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
102   - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
103   - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
104   - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
105   - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
106   - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
107   - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
108   - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
109   - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
110   -
111   - hash[0] += a;
112   - hash[1] += b;
113   - hash[2] += c;
114   - hash[3] += d;
115   -}
116 26  
117 27 /* XXX: this stuff can be optimized */
118 28 static inline void le32_to_cpu_array(u32 *buf, unsigned int words)
include/linux/cryptohash.h
... ... @@ -8,6 +8,11 @@
8 8 void sha_init(__u32 *buf);
9 9 void sha_transform(__u32 *digest, const char *data, __u32 *W);
10 10  
  11 +#define MD5_DIGEST_WORDS 4
  12 +#define MD5_MESSAGE_BYTES 64
  13 +
  14 +void md5_transform(__u32 *hash, __u32 const *in);
  15 +
11 16 __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]);
12 17  
13 18 #endif
... ... @@ -10,7 +10,7 @@
10 10 lib-y := ctype.o string.o vsprintf.o cmdline.o \
11 11 rbtree.o radix-tree.o dump_stack.o timerqueue.o\
12 12 idr.o int_sqrt.o extable.o prio_tree.o \
13   - sha1.o irq_regs.o reciprocal_div.o argv_split.o \
  13 + sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \
14 14 proportions.o prio_heap.o ratelimit.o show_mem.o \
15 15 is_single_threaded.o plist.o decompress.o find_next_bit.o
16 16  
  1 +#include <linux/kernel.h>
  2 +#include <linux/module.h>
  3 +#include <linux/cryptohash.h>
  4 +
  5 +#define F1(x, y, z) (z ^ (x & (y ^ z)))
  6 +#define F2(x, y, z) F1(z, x, y)
  7 +#define F3(x, y, z) (x ^ y ^ z)
  8 +#define F4(x, y, z) (y ^ (x | ~z))
  9 +
  10 +#define MD5STEP(f, w, x, y, z, in, s) \
  11 + (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x)
  12 +
  13 +void md5_transform(__u32 *hash, __u32 const *in)
  14 +{
  15 + u32 a, b, c, d;
  16 +
  17 + a = hash[0];
  18 + b = hash[1];
  19 + c = hash[2];
  20 + d = hash[3];
  21 +
  22 + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  23 + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  24 + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  25 + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  26 + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  27 + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  28 + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  29 + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  30 + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  31 + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  32 + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  33 + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  34 + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  35 + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  36 + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  37 + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
  38 +
  39 + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  40 + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  41 + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  42 + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  43 + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  44 + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  45 + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  46 + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  47 + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  48 + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  49 + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  50 + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  51 + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  52 + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  53 + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  54 + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
  55 +
  56 + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  57 + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  58 + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  59 + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  60 + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  61 + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  62 + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  63 + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  64 + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  65 + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  66 + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  67 + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  68 + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  69 + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  70 + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  71 + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
  72 +
  73 + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  74 + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  75 + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  76 + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  77 + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  78 + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  79 + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  80 + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  81 + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  82 + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  83 + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  84 + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  85 + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  86 + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  87 + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  88 + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
  89 +
  90 + hash[0] += a;
  91 + hash[1] += b;
  92 + hash[2] += c;
  93 + hash[3] += d;
  94 +}
  95 +EXPORT_SYMBOL(md5_transform);