summaryrefslogtreecommitdiff
path: root/noncore/apps/zsafe/krc2.cpp
Unidiff
Diffstat (limited to 'noncore/apps/zsafe/krc2.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/zsafe/krc2.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/noncore/apps/zsafe/krc2.cpp b/noncore/apps/zsafe/krc2.cpp
new file mode 100644
index 0000000..162a1b4
--- a/dev/null
+++ b/noncore/apps/zsafe/krc2.cpp
@@ -0,0 +1,203 @@
1/* C implementation of RC2 encryption algorithm, as described in RFC2268 */
2/* By Matthew Palmer <mjp16@uow.edu.au> */
3/* $Id$ */
4
5#include "krc2.h"
6
7unsigned char _rc2_pitable[] = { 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed,
8 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d,
9 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e,
10 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2,
11 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13,
12 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32,
13 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b,
14 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82,
15 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c,
16 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc,
17 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1,
18 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26,
19 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57,
20 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03,
21 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7,
22 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7,
23 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7,
24 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a,
25 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74,
26 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec,
27 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc,
28 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39,
29 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a,
30 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31,
31 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae,
32 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9,
33 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c,
34 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9,
35 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0,
36 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e,
37 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77,
38 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad };
39
40 unsigned char _rc2_expkey[128];/* Expanded Key */
41 int _rc2_counter; /* global integer variable used in mixing */
42int _rc2_s[] = {1, 2, 3, 5};
43
44Krc2::Krc2()
45{
46}
47
48Krc2::~Krc2()
49{
50}
51
52void Krc2::rc2_expandkey(char key[], int length, int ekl)
53{
54 int ekl8, keymask, i;
55
56 /* Put supplied key into first length - 1 bytes of the key buffer */
57 for (i = 0; i < length; i++) {
58 _rc2_expkey[i] = key[i];
59 }
60
61 ekl8 = (ekl + 7) / 8;
62 i = _rc2_pow(2, (8 + ekl - 8 * ekl8));
63 keymask = 255 % i;
64
65 /* First expansion step */
66 for (i = length; i < 128; i++) {
67 _rc2_expkey[i] = _rc2_pitable[(_rc2_expkey[i - 1] + _rc2_expkey[i - length]) % 256];
68 }
69
70 /* Expansion intermediate step */
71 _rc2_expkey[128 - ekl8] = _rc2_pitable[_rc2_expkey[128 - ekl8] & keymask];
72
73 /* Third Expansion step */
74 for (i = 127 - ekl8; i >= 0; i--) {
75 _rc2_expkey[i] = _rc2_pitable[_rc2_expkey[i + 1] ^ _rc2_expkey[i + ekl8]];
76 }
77}
78
79void Krc2::rc2_encrypt(unsigned short input[4])
80{
81 int i;
82
83 _rc2_counter = 0;
84 for (i = 0; i < 5; i++) {
85 _rc2_mix(input);
86 }
87 _rc2_mash(input);
88 for (i = 0; i < 6; i++) {
89 _rc2_mix(input);
90 }
91 _rc2_mash(input);
92 for (i = 0; i < 5; i++) {
93 _rc2_mix(input);
94 }
95}
96
97void Krc2::_rc2_mix(unsigned short input[])
98{
99 unsigned short K, i;
100
101 for (i = 0; i < 4; i++) {
102 K = _rc2_expkey[_rc2_counter * 2] + 256 * _rc2_expkey[_rc2_counter * 2 + 1];
103 input[i] = input[i] + K + (input[(i + 3) % 4] & input[(i + 2) % 4]) + ((~input[(i + 3) % 4]) & input[(i + 1) % 4]);
104 _rc2_counter++;
105 input[i] = _rc2_rol(input[i], _rc2_s[i]);
106 }
107}
108
109void Krc2::_rc2_mash(unsigned short input[])
110{
111 unsigned short K, i, x;
112
113 for (i = 0; i < 4; i++) {
114 x = input[(i + 3) % 4] & 63;
115 K = _rc2_expkey[2 * x] + 256 * _rc2_expkey[2 * x + 1];
116 input[i] = input[i] + K;
117 }
118}
119
120void Krc2::rc2_decrypt(unsigned short input[4])
121{
122 int i;
123
124 _rc2_counter = 63;
125 for (i = 0; i < 5; i++) {
126 _rc2_rmix(input);
127 }
128 _rc2_rmash(input);
129 for (i = 0; i < 6; i++) {
130 _rc2_rmix(input);
131 }
132 _rc2_rmash(input);
133 for (i = 0; i < 5; i++) {
134 _rc2_rmix(input);
135 }
136}
137
138void Krc2::_rc2_rmix(unsigned short input[])
139{
140 unsigned short K;
141 int i;
142
143 for (i = 3; i >= 0; i--) {
144 input[i] = _rc2_ror(input[i], _rc2_s[i]);
145 K = _rc2_expkey[_rc2_counter * 2] + 256 * _rc2_expkey[_rc2_counter * 2 + 1];
146 input[i] = input[i] - K - (input[(i + 3) % 4] & input[(i + 2) % 4]) - ((~input[(i + 3) % 4]) & input[(i + 1) % 4]);
147 _rc2_counter--;
148 }
149}
150
151void Krc2::_rc2_rmash(unsigned short input[])
152{
153 unsigned short K, x;
154 int i;
155
156 for (i = 3; i >= 0; i--) {
157 x = input[(i + 3) % 4] & 63;
158 K = _rc2_expkey[2 * x] + 256 * _rc2_expkey[2 * x + 1];
159 input[i] = input[i] - K;
160 }
161}
162
163int Krc2::_rc2_pow(int base, int exponent)
164{
165 int i, result;
166
167 if (exponent == 0) {
168 return 1;
169 }
170 result = 1;
171 for (i = 0; i < exponent; i++) {
172 result = result * base;
173 }
174 return result;
175}
176
177unsigned short Krc2::_rc2_rol(unsigned short input, int places)
178{
179 unsigned short temp, i;
180
181 for (i = 0; i < places; i++) {
182 temp = input & 0x8000;
183 input = input << 1;
184 if (temp) {
185 input++;
186 }
187 }
188 return input;
189}
190
191unsigned short Krc2::_rc2_ror(unsigned short input, int places)
192{
193 unsigned short temp, i;
194 for (i = 0; i < places; i++) {
195 temp = input & 0x1;
196 input = input >> 1;
197 if (temp) {
198 input = input + 0x8000;
199 }
200 }
201 return input;
202}
203