]>
git.saurik.com Git - apple/xnu.git/blob - bsd/crypto/rc5/rc5.c
10eb5fe173dc75d953324b7c136eb4a3d085955c
2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <crypto/rc5/rc5.h>
33 set_rc5_expandkey(e_key
, key
, keylen
, rounds
)
39 int i
, j
, k
, LL
, t
, T
;
43 LL
= (keylen
+ WW
- 1) / WW
;
45 bzero(L
, sizeof(RC5_WORD
)*LL
);
47 for (i
= 0; i
< keylen
; i
++) {
48 t
= (key
[i
] & 0xff) << (8*(i%4
));
49 L
[i
/WW
] = L
[i
/WW
] + t
;
54 for (i
= 1; i
< T
; i
++)
55 e_key
[i
] = e_key
[i
-1] + Qw
;
65 A
= ROTL(e_key
[i
]+A
+B
, 3, W
);
67 B
= ROTL(L
[j
]+A
+B
, A
+B
, W
);
80 rc5_encrypt_round16(out
, in
, e_key
)
83 const RC5_WORD
*e_key
;
86 const RC5_WORD
*e_keyA
, *e_keyB
;
89 A
+= (in
[1] & 0xff) << 8;
90 A
+= (in
[2] & 0xff) << 16;
91 A
+= (in
[3] & 0xff) << 24;
93 B
+= (in
[5] & 0xff) << 8;
94 B
+= (in
[6] & 0xff) << 16;
95 B
+= (in
[7] & 0xff) << 24;
100 A
+= *e_keyA
; e_keyA
+= 2;
101 B
+= *e_keyB
; e_keyB
+= 2;
103 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
104 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
105 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
106 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
107 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
108 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
109 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
110 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2; /* round 4 */
111 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
112 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
113 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
114 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
115 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
116 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
117 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
118 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2; /* round 8 */
119 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
120 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
121 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
122 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
123 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
124 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
125 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
126 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2; /* round 12 */
127 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
128 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
129 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
130 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
131 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
132 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2;
133 A
= ROTL(A
^B
, B
, W
) + *e_keyA
; e_keyA
+= 2;
134 B
= ROTL(B
^A
, A
, W
) + *e_keyB
; e_keyB
+= 2; /* round 16 */
137 out
[1] = (A
>> 8) & 0xff;
138 out
[2] = (A
>> 16) & 0xff;
139 out
[3] = (A
>> 24) & 0xff;
141 out
[5] = (B
>> 8) & 0xff;
142 out
[6] = (B
>> 16) & 0xff;
143 out
[7] = (B
>> 24) & 0xff;
151 rc5_decrypt_round16(out
, in
, e_key
)
154 const RC5_WORD
*e_key
;
157 const RC5_WORD
*e_keyA
, *e_keyB
;
160 A
+= (in
[1] & 0xff) << 8;
161 A
+= (in
[2] & 0xff) << 16;
162 A
+= (in
[3] & 0xff) << 24;
164 B
+= (in
[5] & 0xff) << 8;
165 B
+= (in
[6] & 0xff) << 16;
166 B
+= (in
[7] & 0xff) << 24;
168 e_keyA
= e_key
+ 2*16;
169 e_keyB
= e_key
+ 2*16 + 1;
171 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
172 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
173 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
174 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
175 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
176 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
177 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
178 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2; /* round 4 */
179 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
180 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
181 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
182 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
183 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
184 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
185 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
186 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2; /* round 8 */
187 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
188 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
189 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
190 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
191 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
192 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
193 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
194 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2; /* round 12 */
195 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
196 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
197 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
198 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
199 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
200 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2;
201 B
= ROTR(B
-*e_keyB
, A
, W
) ^ A
; e_keyB
-= 2;
202 A
= ROTR(A
-*e_keyA
, B
, W
) ^ B
; e_keyA
-= 2; /* round 16 */
208 out
[1] = (A
>> 8) & 0xff;
209 out
[2] = (A
>> 16) & 0xff;
210 out
[3] = (A
>> 24) & 0xff;
212 out
[5] = (B
>> 8) & 0xff;
213 out
[6] = (B
>> 16) & 0xff;
214 out
[7] = (B
>> 24) & 0xff;