11 typedef unsigned int uint32
;
13 static uint32
rotate(uint32 u
,int c
)
15 return (u
<< c
) | (u
>> (32 - c
));
18 static uint32
load_littleendian(const unsigned char *x
)
22 | (((uint32
) (x
[1])) << 8) \
23 | (((uint32
) (x
[2])) << 16) \
24 | (((uint32
) (x
[3])) << 24)
28 static void store_littleendian(unsigned char *x
,uint32 u
)
38 const unsigned char *in
,
39 const unsigned char *k
,
40 const unsigned char *c
43 uint32 x0
, x1
, x2
, x3
, x4
, x5
, x6
, x7
, x8
, x9
, x10
, x11
, x12
, x13
, x14
, x15
;
44 uint32 j0
, j1
, j2
, j3
, j4
, j5
, j6
, j7
, j8
, j9
, j10
, j11
, j12
, j13
, j14
, j15
;
47 j0
= x0
= load_littleendian(c
+ 0);
48 j1
= x1
= load_littleendian(k
+ 0);
49 j2
= x2
= load_littleendian(k
+ 4);
50 j3
= x3
= load_littleendian(k
+ 8);
51 j4
= x4
= load_littleendian(k
+ 12);
52 j5
= x5
= load_littleendian(c
+ 4);
53 j6
= x6
= load_littleendian(in
+ 0);
54 j7
= x7
= load_littleendian(in
+ 4);
55 j8
= x8
= load_littleendian(in
+ 8);
56 j9
= x9
= load_littleendian(in
+ 12);
57 j10
= x10
= load_littleendian(c
+ 8);
58 j11
= x11
= load_littleendian(k
+ 16);
59 j12
= x12
= load_littleendian(k
+ 20);
60 j13
= x13
= load_littleendian(k
+ 24);
61 j14
= x14
= load_littleendian(k
+ 28);
62 j15
= x15
= load_littleendian(c
+ 12);
64 for (i
= ROUNDS
;i
> 0;i
-= 2) {
65 x4
^= rotate( x0
+x12
, 7);
66 x8
^= rotate( x4
+ x0
, 9);
67 x12
^= rotate( x8
+ x4
,13);
68 x0
^= rotate(x12
+ x8
,18);
69 x9
^= rotate( x5
+ x1
, 7);
70 x13
^= rotate( x9
+ x5
, 9);
71 x1
^= rotate(x13
+ x9
,13);
72 x5
^= rotate( x1
+x13
,18);
73 x14
^= rotate(x10
+ x6
, 7);
74 x2
^= rotate(x14
+x10
, 9);
75 x6
^= rotate( x2
+x14
,13);
76 x10
^= rotate( x6
+ x2
,18);
77 x3
^= rotate(x15
+x11
, 7);
78 x7
^= rotate( x3
+x15
, 9);
79 x11
^= rotate( x7
+ x3
,13);
80 x15
^= rotate(x11
+ x7
,18);
81 x1
^= rotate( x0
+ x3
, 7);
82 x2
^= rotate( x1
+ x0
, 9);
83 x3
^= rotate( x2
+ x1
,13);
84 x0
^= rotate( x3
+ x2
,18);
85 x6
^= rotate( x5
+ x4
, 7);
86 x7
^= rotate( x6
+ x5
, 9);
87 x4
^= rotate( x7
+ x6
,13);
88 x5
^= rotate( x4
+ x7
,18);
89 x11
^= rotate(x10
+ x9
, 7);
90 x8
^= rotate(x11
+x10
, 9);
91 x9
^= rotate( x8
+x11
,13);
92 x10
^= rotate( x9
+ x8
,18);
93 x12
^= rotate(x15
+x14
, 7);
94 x13
^= rotate(x12
+x15
, 9);
95 x14
^= rotate(x13
+x12
,13);
96 x15
^= rotate(x14
+x13
,18);
116 store_littleendian(out
+ 0,x0
);
117 store_littleendian(out
+ 4,x1
);
118 store_littleendian(out
+ 8,x2
);
119 store_littleendian(out
+ 12,x3
);
120 store_littleendian(out
+ 16,x4
);
121 store_littleendian(out
+ 20,x5
);
122 store_littleendian(out
+ 24,x6
);
123 store_littleendian(out
+ 28,x7
);
124 store_littleendian(out
+ 32,x8
);
125 store_littleendian(out
+ 36,x9
);
126 store_littleendian(out
+ 40,x10
);
127 store_littleendian(out
+ 44,x11
);
128 store_littleendian(out
+ 48,x12
);
129 store_littleendian(out
+ 52,x13
);
130 store_littleendian(out
+ 56,x14
);
131 store_littleendian(out
+ 60,x15
);