Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/crypt.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4433 - (show annotations) (download) (as text)
Mon Apr 11 00:29:12 2011 UTC (13 years ago) by doda
Original Path: trunk/ttssh2/ttxssh/crypt.c
File MIME type: text/x-csrc
File size: 61967 byte(s)
Camellia γ‚΅γƒγƒΌγƒˆ

1 /*
2 Copyright (c) 1998-2001, Robert O'Callahan
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7
8 Redistributions of source code must retain the above copyright notice, this list of
9 conditions and the following disclaimer.
10
11 Redistributions in binary form must reproduce the above copyright notice, this list
12 of conditions and the following disclaimer in the documentation and/or other materials
13 provided with the distribution.
14
15 The name of Robert O'Callahan may not be used to endorse or promote products derived from
16 this software without specific prior written permission.
17
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #define WINDOWS
30
31 #include "ttxssh.h"
32 #include "util.h"
33
34 #include <openssl/rand.h>
35 #include <openssl/bn.h>
36 #include <openssl/md5.h>
37 #include <openssl/err.h>
38 #include <openssl/des.h>
39 #include <openssl/hmac.h> // for SSH2(yutaka)
40 #include <openssl/dsa.h>
41 #include "cipher.h"
42 #include "ssh.h"
43
44 #define do_crc(buf, len) (~(uint32)crc32(0xFFFFFFFF, (buf), (len)))
45 #define get_uint32(buf) get_uint32_MSBfirst((buf))
46
47 #define DEATTACK_OK 0
48 #define DEATTACK_DETECTED 1
49
50 /*
51 * $Id: crypt.c,v 1.28 2008-11-23 07:44:05 doda Exp $ Cryptographic attack
52 * detector for ssh - source code (C)1998 CORE-SDI, Buenos Aires Argentina
53 * Ariel Futoransky(futo@core-sdi.com) <http://www.core-sdi.com>
54 */
55
56 /* SSH Constants */
57 #define SSH_BLOCKSIZE 8
58
59 /* Hashing constants */
60 #define HASH_MINSIZE 8*2048
61 #define HASH_ENTRYSIZE 4
62 #define HASH_FACTOR(x) ((x)*3/2)
63 #define HASH_UNUSEDCHAR 0xff
64 #define HASH_UNUSED 0xffffffff
65 #define HASH_IV 0xfffffffe
66
67 #define HASH_MINBLOCKS (7*SSH_BLOCKSIZE)
68
69 /* Hash function (Input keys are cipher results) */
70 #define HASH(x) get_uint32(x)
71
72 #define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE)
73
74
75
76 static void crc_update(uint32 FAR * a, uint32 b)
77 {
78 b ^= *a;
79 *a = do_crc((unsigned char FAR *) &b, sizeof(b));
80 }
81
82 /* check_crc
83 detects if a block is used in a particular pattern
84 */
85
86 static int check_crc(unsigned char FAR * S, unsigned char FAR * buf,
87 uint32 len, unsigned char FAR * IV)
88 {
89 uint32 crc;
90 unsigned char FAR *c;
91
92 crc = 0;
93 if (IV && !CMP(S, IV)) {
94 crc_update(&crc, 1);
95 crc_update(&crc, 0);
96 }
97 for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
98 if (!CMP(S, c)) {
99 crc_update(&crc, 1);
100 crc_update(&crc, 0);
101 } else {
102 crc_update(&crc, 0);
103 crc_update(&crc, 0);
104 }
105 }
106
107 return crc == 0;
108 }
109
110
111 /*
112 detect_attack
113 Detects a crc32 compensation attack on a packet
114 */
115 static int detect_attack(CRYPTDetectAttack FAR * statics,
116 unsigned char FAR * buf, uint32 len,
117 unsigned char *FAR IV)
118 {
119 uint32 FAR *h = statics->h;
120 uint32 n = statics->n;
121 uint32 i, j;
122 uint32 l;
123 unsigned char FAR *c;
124 unsigned char FAR *d;
125
126 for (l = n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2) {
127 }
128
129 if (h == NULL) {
130 n = l;
131 h = (uint32 FAR *) malloc(n * HASH_ENTRYSIZE);
132 } else {
133 if (l > n) {
134 n = l;
135 h = (uint32 FAR *) realloc(h, n * HASH_ENTRYSIZE);
136 }
137 }
138
139 statics->h = h;
140 statics->n = n;
141
142 if (len <= HASH_MINBLOCKS) {
143 for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
144 if (IV && (!CMP(c, IV))) {
145 if ((check_crc(c, buf, len, IV)))
146 return DEATTACK_DETECTED;
147 else
148 break;
149 }
150 for (d = buf; d < c; d += SSH_BLOCKSIZE) {
151 if (!CMP(c, d)) {
152 if ((check_crc(c, buf, len, IV)))
153 return DEATTACK_DETECTED;
154 else
155 break;
156 }
157 }
158 }
159 return (DEATTACK_OK);
160 }
161 memset(h, HASH_UNUSEDCHAR, n * HASH_ENTRYSIZE);
162
163 if (IV) {
164 h[HASH(IV) & (n - 1)] = HASH_IV;
165 }
166
167 for (c = buf, j = 0; c < (buf + len); c += SSH_BLOCKSIZE, j++) {
168 for (i = HASH(c) & (n - 1); h[i] != HASH_UNUSED;
169 i = (i + 1) & (n - 1)) {
170 if (h[i] == HASH_IV) {
171 if (!CMP(c, IV)) {
172 if (check_crc(c, buf, len, IV))
173 return DEATTACK_DETECTED;
174 else
175 break;
176 }
177 } else if (!CMP(c, buf + h[i] * SSH_BLOCKSIZE)) {
178 if (check_crc(c, buf, len, IV))
179 return DEATTACK_DETECTED;
180 else
181 break;
182 }
183 }
184 h[i] = j;
185 }
186
187 return DEATTACK_OK;
188 }
189
190 BOOL CRYPT_detect_attack(PTInstVar pvar, unsigned char FAR * buf,
191 int bytes)
192 {
193 if (SSHv1(pvar)) {
194 switch (pvar->crypt_state.sender_cipher) {
195 case SSH_CIPHER_NONE:
196 return FALSE;
197 case SSH_CIPHER_IDEA:
198 return detect_attack(&pvar->crypt_state.detect_attack_statics,
199 buf, bytes,
200 pvar->crypt_state.dec.cIDEA.ivec) ==
201 DEATTACK_DETECTED;
202 default:
203 return detect_attack(&pvar->crypt_state.detect_attack_statics,
204 buf, bytes, NULL) == DEATTACK_DETECTED;
205 }
206 } else {
207 return FALSE;
208 }
209 }
210
211 static void no_encrypt(PTInstVar pvar, unsigned char FAR * buf, int bytes)
212 {
213 }
214
215
216 // for SSH2(yutaka)
217 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AAES192, AES256 οΏ½οΏ½οΏ½οΏ½
218 // cAES128_encrypt/cAES128_decrypt οΏ½οΏ½οΏ½gοΏ½pοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ (2007.10.16 maya)
219 static void cAES128_encrypt(PTInstVar pvar, unsigned char FAR * buf,
220 int bytes)
221 {
222 unsigned char *newbuf = malloc(bytes);
223 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
224 char tmp[80];
225
226 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
227 if (bytes == 0)
228 goto error;
229
230 if (newbuf == NULL)
231 return;
232
233 if (bytes % block_size) {
234 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
235 "%s encrypt error(1): bytes %d (%d)");
236 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
237 "AES128/192/256", bytes, block_size);
238 notify_fatal_error(pvar, tmp);
239 goto error;
240 }
241
242 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
243 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
244 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
245 "AES128/192/256");
246 notify_fatal_error(pvar, tmp);
247 goto error;
248
249 } else {
250 //unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN];
251 //memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, AES128_KEYLEN);
252 // IVοΏ½οΏ½DESοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½XοΏ½VοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½[οΏ½JοΏ½οΏ½οΏ½οΏ½οΏ½RοΏ½sοΏ½[οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½gοΏ½οΏ½οΏ½B
253 //memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, AES128_IVLEN);
254
255 //debug_print(50, key, 24);
256 //debug_print(51, iv, 8);
257 //debug_print(52, buf, bytes);
258 //debug_print(53, newbuf, bytes);
259
260 memcpy(buf, newbuf, bytes);
261 }
262
263 error:
264 free(newbuf);
265 }
266
267 static void cAES128_decrypt(PTInstVar pvar, unsigned char FAR * buf,
268 int bytes)
269 {
270 unsigned char *newbuf = malloc(bytes);
271 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
272 char tmp[80];
273
274 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
275 if (bytes == 0)
276 goto error;
277
278 if (newbuf == NULL)
279 return;
280
281 if (bytes % block_size) {
282 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
283 "%s decrypt error(1): bytes %d (%d)");
284 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
285 "AES128/192/256", bytes, block_size);
286 notify_fatal_error(pvar, tmp);
287 goto error;
288 }
289
290 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
291 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
292 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
293 "AES128/192/256");
294 notify_fatal_error(pvar, tmp);
295 goto error;
296
297 } else {
298 //unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN];
299 //memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, AES128_KEYLEN);
300 // IVοΏ½οΏ½DESοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½XοΏ½VοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½[οΏ½JοΏ½οΏ½οΏ½οΏ½οΏ½RοΏ½sοΏ½[οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½gοΏ½οΏ½οΏ½B
301 //memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, AES128_IVLEN);
302
303 //debug_print(70, key, AES128_KEYLEN);
304 //debug_print(71, iv, AES128_IVLEN);
305 //debug_print(72, buf, bytes);
306 //debug_print(73, newbuf, bytes);
307
308 memcpy(buf, newbuf, bytes);
309 }
310
311 error:
312 free(newbuf);
313 }
314
315
316 // for SSH2(yutaka)
317 static void c3DES_encrypt2(PTInstVar pvar, unsigned char FAR * buf,
318 int bytes)
319 {
320 unsigned char *newbuf = malloc(bytes);
321 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
322 char tmp[80];
323
324 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
325 if (bytes == 0)
326 goto error;
327
328 if (newbuf == NULL)
329 return;
330
331 if (bytes % block_size) {
332 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
333 "%s encrypt error(1): bytes %d (%d)");
334 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
335 "3DES-CBC", bytes, block_size);
336 notify_fatal_error(pvar, tmp);
337 goto error;
338 }
339
340 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
341 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
342 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
343 "3DES-CBC");
344 notify_fatal_error(pvar, tmp);
345 goto error;
346
347 } else {
348 //unsigned char key[24], iv[8];
349 //memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, 24);
350 // IVοΏ½οΏ½DESοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½XοΏ½VοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½[οΏ½JοΏ½οΏ½οΏ½οΏ½οΏ½RοΏ½sοΏ½[οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½gοΏ½οΏ½οΏ½B
351 //memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, 8);
352
353 //debug_print(50, key, 24);
354 //debug_print(51, iv, 8);
355 //debug_print(52, buf, bytes);
356 //debug_print(53, newbuf, bytes);
357
358 memcpy(buf, newbuf, bytes);
359 }
360
361 error:
362 free(newbuf);
363 }
364
365 static void c3DES_decrypt2(PTInstVar pvar, unsigned char FAR * buf,
366 int bytes)
367 {
368 unsigned char *newbuf = malloc(bytes);
369 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
370 char tmp[80];
371
372 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
373 if (bytes == 0)
374 goto error;
375
376 if (newbuf == NULL)
377 return;
378
379 if (bytes % block_size) {
380 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
381 "%s decrypt error(1): bytes %d (%d)");
382 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
383 "3DES-CBC", bytes, block_size);
384 notify_fatal_error(pvar, tmp);
385 goto error;
386 }
387
388 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
389 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
390 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
391 "3DES-CBC");
392 notify_fatal_error(pvar, tmp);
393 goto error;
394
395 } else {
396 //unsigned char key[24], iv[8];
397 //memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, 24);
398 // IVοΏ½οΏ½DESοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½XοΏ½VοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½[οΏ½JοΏ½οΏ½οΏ½οΏ½οΏ½RοΏ½sοΏ½[οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½gοΏ½οΏ½οΏ½B
399 //memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, 8);
400
401 //debug_print(70, key, 24);
402 //debug_print(71, iv, 8);
403 //debug_print(72, buf, bytes);
404 //debug_print(73, newbuf, bytes);
405
406 memcpy(buf, newbuf, bytes);
407 }
408
409 error:
410 free(newbuf);
411 }
412
413
414 static void cBlowfish_encrypt2(PTInstVar pvar, unsigned char FAR * buf,
415 int bytes)
416 {
417 unsigned char *newbuf = malloc(bytes);
418 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
419 char tmp[80];
420
421 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
422 if (bytes == 0)
423 goto error;
424
425 if (newbuf == NULL)
426 return;
427
428 if (bytes % block_size) {
429 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
430 "%s encrypt error(1): bytes %d (%d)");
431 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
432 "Blowfish", bytes, block_size);
433 notify_fatal_error(pvar, tmp);
434 goto error;
435 }
436
437 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
438 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
439 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
440 "Blowfish");
441 notify_fatal_error(pvar, tmp);
442 goto error;
443
444 } else {
445 memcpy(buf, newbuf, bytes);
446
447 }
448
449 error:
450 free(newbuf);
451 }
452
453 static void cBlowfish_decrypt2(PTInstVar pvar, unsigned char FAR * buf,
454 int bytes)
455 {
456 unsigned char *newbuf = malloc(bytes);
457 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
458 char tmp[80];
459
460 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
461 if (bytes == 0)
462 goto error;
463
464 if (newbuf == NULL)
465 return;
466
467 if (bytes % block_size) {
468 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
469 "%s decrypt error(1): bytes %d (%d)");
470 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
471 "Blowfish", bytes, block_size);
472 notify_fatal_error(pvar, tmp);
473 goto error;
474 }
475
476 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
477 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
478 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
479 "Blowfish");
480 notify_fatal_error(pvar, tmp);
481 goto error;
482
483 } else {
484 memcpy(buf, newbuf, bytes);
485
486 }
487
488 error:
489 free(newbuf);
490 }
491
492
493 static void cArcfour_encrypt(PTInstVar pvar, unsigned char FAR * buf,
494 int bytes)
495 {
496 unsigned char *newbuf = malloc(bytes);
497 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
498 char tmp[80];
499
500 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
501 if (bytes == 0)
502 goto error;
503
504 if (newbuf == NULL)
505 return;
506
507 if (bytes % block_size) {
508 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
509 "%s encrypt error(1): bytes %d (%d)");
510 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
511 "Arcfour", bytes, block_size);
512 notify_fatal_error(pvar, tmp);
513 goto error;
514 }
515
516 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
517 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
518 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
519 "Arcfour");
520 notify_fatal_error(pvar, tmp);
521 goto error;
522
523 } else {
524 memcpy(buf, newbuf, bytes);
525
526 }
527
528 error:
529 free(newbuf);
530 }
531
532 static void cArcfour_decrypt(PTInstVar pvar, unsigned char FAR * buf,
533 int bytes)
534 {
535 unsigned char *newbuf = malloc(bytes);
536 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
537 char tmp[80];
538
539 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
540 if (bytes == 0)
541 goto error;
542
543 if (newbuf == NULL)
544 return;
545
546 if (bytes % block_size) {
547 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
548 "%s decrypt error(1): bytes %d (%d)");
549 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
550 "Arcfour", bytes, block_size);
551 notify_fatal_error(pvar, tmp);
552 goto error;
553 }
554
555 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
556 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
557 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
558 "Arcfour");
559 notify_fatal_error(pvar, tmp);
560 goto error;
561
562 } else {
563 memcpy(buf, newbuf, bytes);
564
565 }
566
567 error:
568 free(newbuf);
569 }
570
571
572 static void cCast128_encrypt(PTInstVar pvar, unsigned char FAR * buf,
573 int bytes)
574 {
575 unsigned char *newbuf = malloc(bytes);
576 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
577 char tmp[80];
578
579 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
580 if (bytes == 0)
581 goto error;
582
583 if (newbuf == NULL)
584 return;
585
586 if (bytes % block_size) {
587 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
588 "%s encrypt error(1): bytes %d (%d)");
589 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
590 "CAST128", bytes, block_size);
591 notify_fatal_error(pvar, tmp);
592 goto error;
593 }
594
595 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
596 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
597 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
598 "CAST128");
599 notify_fatal_error(pvar, tmp);
600 goto error;
601
602 } else {
603 memcpy(buf, newbuf, bytes);
604
605 }
606
607 error:
608 free(newbuf);
609 }
610
611 static void cCast128_decrypt(PTInstVar pvar, unsigned char FAR * buf,
612 int bytes)
613 {
614 unsigned char *newbuf = malloc(bytes);
615 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
616 char tmp[80];
617
618 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
619 if (bytes == 0)
620 goto error;
621
622 if (newbuf == NULL)
623 return;
624
625 if (bytes % block_size) {
626 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
627 "%s decrypt error(1): bytes %d (%d)");
628 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
629 "CAST128", bytes, block_size);
630 notify_fatal_error(pvar, tmp);
631 goto error;
632 }
633
634 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
635 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
636 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
637 "CAST128");
638 notify_fatal_error(pvar, tmp);
639 goto error;
640
641 } else {
642 memcpy(buf, newbuf, bytes);
643
644 }
645
646 error:
647 free(newbuf);
648 }
649
650 #ifdef WITH_CAMELLIA_DRAFT
651 static void cCamellia_encrypt(PTInstVar pvar, unsigned char FAR * buf,
652 int bytes)
653 {
654 unsigned char *newbuf = malloc(bytes);
655 int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
656 char tmp[80];
657
658 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
659 if (bytes == 0)
660 goto error;
661
662 if (newbuf == NULL)
663 return;
664
665 if (bytes % block_size) {
666 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR1", pvar,
667 "%s encrypt error(1): bytes %d (%d)");
668 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
669 "Camellia128/192/256", bytes, block_size);
670 notify_fatal_error(pvar, tmp);
671 goto error;
672 }
673
674 if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
675 UTIL_get_lang_msg("MSG_ENCRYPT_ERROR2", pvar, "%s encrypt error(2)");
676 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
677 "Camellia128/192/256");
678 notify_fatal_error(pvar, tmp);
679 goto error;
680
681 } else {
682 memcpy(buf, newbuf, bytes);
683
684 }
685
686 error:
687 free(newbuf);
688 }
689
690 static void cCamellia_decrypt(PTInstVar pvar, unsigned char FAR * buf,
691 int bytes)
692 {
693 unsigned char *newbuf = malloc(bytes);
694 int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
695 char tmp[80];
696
697 // οΏ½οΏ½οΏ½OοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½SοΏ½yοΏ½CοΏ½οΏ½οΏ½[οΏ½hοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½A0οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2004.11.7 yutaka)
698 if (bytes == 0)
699 goto error;
700
701 if (newbuf == NULL)
702 return;
703
704 if (bytes % block_size) {
705 UTIL_get_lang_msg("MSG_DECRYPT_ERROR1", pvar,
706 "%s decrypt error(1): bytes %d (%d)");
707 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
708 "Camellia128/192/256", bytes, block_size);
709 notify_fatal_error(pvar, tmp);
710 goto error;
711 }
712
713 if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
714 UTIL_get_lang_msg("MSG_DECRYPT_ERROR2", pvar, "%s decrypt error(2)");
715 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg,
716 "Camellia128/192/256");
717 notify_fatal_error(pvar, tmp);
718 goto error;
719
720 } else {
721 memcpy(buf, newbuf, bytes);
722
723 }
724
725 error:
726 free(newbuf);
727 }
728 #endif // WITH_CAMELLIA_DRAFT
729
730 static void c3DES_encrypt(PTInstVar pvar, unsigned char FAR * buf,
731 int bytes)
732 {
733 Cipher3DESState FAR *encryptstate = &pvar->crypt_state.enc.c3DES;
734
735 DES_ncbc_encrypt(buf, buf, bytes,
736 &encryptstate->k1, &encryptstate->ivec1, DES_ENCRYPT);
737 DES_ncbc_encrypt(buf, buf, bytes,
738 &encryptstate->k2, &encryptstate->ivec2, DES_DECRYPT);
739 DES_ncbc_encrypt(buf, buf, bytes,
740 &encryptstate->k3, &encryptstate->ivec3, DES_ENCRYPT);
741 }
742
743 static void c3DES_decrypt(PTInstVar pvar, unsigned char FAR * buf,
744 int bytes)
745 {
746 Cipher3DESState FAR *decryptstate = &pvar->crypt_state.dec.c3DES;
747
748 DES_ncbc_encrypt(buf, buf, bytes,
749 &decryptstate->k3, &decryptstate->ivec3, DES_DECRYPT);
750 DES_ncbc_encrypt(buf, buf, bytes,
751 &decryptstate->k2, &decryptstate->ivec2, DES_ENCRYPT);
752 DES_ncbc_encrypt(buf, buf, bytes,
753 &decryptstate->k1, &decryptstate->ivec1, DES_DECRYPT);
754 }
755
756 static void cDES_encrypt(PTInstVar pvar, unsigned char FAR * buf,
757 int bytes)
758 {
759 CipherDESState FAR *encryptstate = &pvar->crypt_state.enc.cDES;
760
761 DES_ncbc_encrypt(buf, buf, bytes,
762 &encryptstate->k, &encryptstate->ivec, DES_ENCRYPT);
763 }
764
765 static void cDES_decrypt(PTInstVar pvar, unsigned char FAR * buf,
766 int bytes)
767 {
768 CipherDESState FAR *decryptstate = &pvar->crypt_state.dec.cDES;
769
770 DES_ncbc_encrypt(buf, buf, bytes,
771 &decryptstate->k, &decryptstate->ivec, DES_DECRYPT);
772 }
773
774 static void cIDEA_encrypt(PTInstVar pvar, unsigned char FAR * buf,
775 int bytes)
776 {
777 CipherIDEAState FAR *encryptstate = &pvar->crypt_state.enc.cIDEA;
778 int num = 0;
779
780 idea_cfb64_encrypt(buf, buf, bytes, &encryptstate->k,
781 encryptstate->ivec, &num, IDEA_ENCRYPT);
782 }
783
784 static void cIDEA_decrypt(PTInstVar pvar, unsigned char FAR * buf,
785 int bytes)
786 {
787 CipherIDEAState FAR *decryptstate = &pvar->crypt_state.dec.cIDEA;
788 int num = 0;
789
790 idea_cfb64_encrypt(buf, buf, bytes, &decryptstate->k,
791 decryptstate->ivec, &num, IDEA_DECRYPT);
792 }
793
794 static void flip_endianness(unsigned char FAR * cbuf, int bytes)
795 {
796 uint32 FAR *buf = (uint32 FAR *) cbuf;
797 int count = bytes / 4;
798
799 while (count > 0) {
800 uint32 w = *buf;
801
802 *buf = ((w << 24) & 0xFF000000) | ((w << 8) & 0x00FF0000)
803 | ((w >> 8) & 0x0000FF00) | ((w >> 24) & 0x000000FF);
804 count--;
805 buf++;
806 }
807 }
808
809 static void cBlowfish_encrypt(PTInstVar pvar, unsigned char FAR * buf,
810 int bytes)
811 {
812 CipherBlowfishState FAR *encryptstate =
813 &pvar->crypt_state.enc.cBlowfish;
814
815 flip_endianness(buf, bytes);
816 BF_cbc_encrypt(buf, buf, bytes, &encryptstate->k, encryptstate->ivec,
817 BF_ENCRYPT);
818 flip_endianness(buf, bytes);
819 }
820
821 static void cBlowfish_decrypt(PTInstVar pvar, unsigned char FAR * buf,
822 int bytes)
823 {
824 CipherBlowfishState FAR *decryptstate =
825 &pvar->crypt_state.dec.cBlowfish;
826
827 flip_endianness(buf, bytes);
828 BF_cbc_encrypt(buf, buf, bytes, &decryptstate->k, decryptstate->ivec,
829 BF_DECRYPT);
830 flip_endianness(buf, bytes);
831 }
832
833 static void cRC4_encrypt(PTInstVar pvar, unsigned char FAR * buf,
834 int bytes)
835 {
836 CipherRC4State FAR *encryptstate = &pvar->crypt_state.enc.cRC4;
837 int num = 0;
838
839 RC4(&encryptstate->k, bytes, buf, buf);
840 }
841
842 static void cRC4_decrypt(PTInstVar pvar, unsigned char FAR * buf,
843 int bytes)
844 {
845 CipherRC4State FAR *decryptstate = &pvar->crypt_state.dec.cRC4;
846 int num = 0;
847
848 RC4(&decryptstate->k, bytes, buf, buf);
849 }
850
851 void CRYPT_set_random_data(PTInstVar pvar, unsigned char FAR * buf,
852 int bytes)
853 {
854 RAND_bytes(buf, bytes);
855 }
856
857 void CRYPT_initialize_random_numbers(PTInstVar pvar)
858 {
859 RAND_screen();
860 }
861
862 static BIGNUM FAR *get_bignum(unsigned char FAR * bytes)
863 {
864 int bits = get_ushort16_MSBfirst(bytes);
865
866 return BN_bin2bn(bytes + 2, (bits + 7) / 8, NULL);
867 }
868
869 // make_key()οΏ½οΏ½ fingerprint οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½pοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AstaticοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B(2006.3.27 yutaka)
870 RSA FAR *make_key(PTInstVar pvar,
871 int bits, unsigned char FAR * exp,
872 unsigned char FAR * mod)
873 {
874 RSA FAR *key = RSA_new();
875
876 if (key != NULL) {
877 key->e = get_bignum(exp);
878 key->n = get_bignum(mod);
879 }
880
881 if (key == NULL || key->e == NULL || key->n == NULL) {
882 UTIL_get_lang_msg("MSG_RSAKEY_SETUP_ERROR", pvar,
883 "Error setting up RSA keys");
884 notify_fatal_error(pvar, pvar->ts->UIMsg);
885
886 if (key != NULL) {
887 if (key->e != NULL) {
888 BN_free(key->e);
889 }
890 if (key->n != NULL) {
891 BN_free(key->n);
892 }
893 RSA_free(key);
894 }
895
896 return NULL;
897 } else {
898 return key;
899 }
900 }
901
902 void CRYPT_set_server_cookie(PTInstVar pvar, unsigned char FAR * cookie)
903 {
904 if (SSHv1(pvar)) {
905 memcpy(pvar->crypt_state.server_cookie, cookie, SSH_COOKIE_LENGTH);
906 } else {
907 memcpy(pvar->crypt_state.server_cookie, cookie,
908 SSH2_COOKIE_LENGTH);
909 }
910 }
911
912 void CRYPT_set_client_cookie(PTInstVar pvar, unsigned char FAR * cookie)
913 {
914 if (SSHv2(pvar)) {
915 memcpy(pvar->crypt_state.client_cookie, cookie,
916 SSH2_COOKIE_LENGTH);
917 }
918 }
919
920 BOOL CRYPT_set_server_RSA_key(PTInstVar pvar,
921 int bits, unsigned char FAR * exp,
922 unsigned char FAR * mod)
923 {
924 pvar->crypt_state.server_key.RSA_key = make_key(pvar, bits, exp, mod);
925
926 return pvar->crypt_state.server_key.RSA_key != NULL;
927 }
928
929 BOOL CRYPT_set_host_RSA_key(PTInstVar pvar,
930 int bits, unsigned char FAR * exp,
931 unsigned char FAR * mod)
932 {
933 pvar->crypt_state.host_key.RSA_key = make_key(pvar, bits, exp, mod);
934
935 return pvar->crypt_state.host_key.RSA_key != NULL;
936 }
937
938 BOOL CRYPT_set_supported_ciphers(PTInstVar pvar, int sender_ciphers,
939 int receiver_ciphers)
940 {
941 int cipher_mask;
942
943 if (SSHv1(pvar)) {
944 cipher_mask = (1 << SSH_CIPHER_DES)
945 | (1 << SSH_CIPHER_3DES)
946 | (1 << SSH_CIPHER_BLOWFISH);
947
948 } else { // for SSH2(yutaka)
949 // SSH2οΏ½οΏ½οΏ½TοΏ½|οΏ½[οΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½fοΏ½[οΏ½^οΏ½οΏ½οΏ½MοΏ½pοΏ½AοΏ½οΏ½οΏ½SοΏ½οΏ½οΏ½YοΏ½οΏ½οΏ½iοΏ½οΏ½οΏ½JοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½pοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½j
950 cipher_mask =((1 << SSH2_CIPHER_3DES_CBC)
951 | (1 << SSH2_CIPHER_AES128_CBC)
952 | (1 << SSH2_CIPHER_AES192_CBC)
953 | (1 << SSH2_CIPHER_AES256_CBC)
954 | (1 << SSH2_CIPHER_BLOWFISH_CBC)
955 | (1 << SSH2_CIPHER_AES128_CTR)
956 | (1 << SSH2_CIPHER_AES192_CTR)
957 | (1 << SSH2_CIPHER_AES256_CTR)
958 | (1 << SSH2_CIPHER_ARCFOUR)
959 | (1 << SSH2_CIPHER_ARCFOUR128)
960 | (1 << SSH2_CIPHER_ARCFOUR256)
961 | (1 << SSH2_CIPHER_CAST128_CBC)
962 | (1 << SSH2_CIPHER_3DES_CTR)
963 | (1 << SSH2_CIPHER_BLOWFISH_CTR)
964 | (1 << SSH2_CIPHER_CAST128_CTR)
965 #ifdef WITH_CAMELLIA_DRAFT
966 | (1 << SSH2_CIPHER_CAMELLIA128_CBC)
967 | (1 << SSH2_CIPHER_CAMELLIA192_CBC)
968 | (1 << SSH2_CIPHER_CAMELLIA256_CBC)
969 | (1 << SSH2_CIPHER_CAMELLIA128_CTR)
970 | (1 << SSH2_CIPHER_CAMELLIA192_CTR)
971 | (1 << SSH2_CIPHER_CAMELLIA256_CTR)
972 #endif // WITH_CAMELLIA_DRAFT
973 );
974 }
975
976 sender_ciphers &= cipher_mask;
977 receiver_ciphers &= cipher_mask;
978 pvar->crypt_state.supported_sender_ciphers = sender_ciphers;
979 pvar->crypt_state.supported_receiver_ciphers = receiver_ciphers;
980
981 if (sender_ciphers == 0) {
982 UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar,
983 "The server does not support any of the TTSSH encryption algorithms.\n"
984 "A secure connection cannot be made in the TTSSH-to-server direction.\n"
985 "The connection will be closed.");
986 notify_fatal_error(pvar, pvar->ts->UIMsg);
987 return FALSE;
988 } else if (receiver_ciphers == 0) {
989 UTIL_get_lang_msg("MSG_UNAVAILABLE_CIPHERS_ERROR", pvar,
990 "The server does not support any of the TTSSH encryption algorithms.\n"
991 "A secure connection cannot be made in the TTSSH-to-server direction.\n"
992 "The connection will be closed.");
993 notify_fatal_error(pvar, pvar->ts->UIMsg);
994 return FALSE;
995 } else {
996 return TRUE;
997 }
998 }
999
1000 int CRYPT_get_decryption_block_size(PTInstVar pvar)
1001 {
1002 if (SSHv1(pvar)) {
1003 return 8;
1004 } else {
1005 // οΏ½pοΏ½PοΏ½bοΏ½gοΏ½οΏ½οΏ½MοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½SοΏ½οΏ½οΏ½YοΏ½οΏ½οΏ½οΏ½οΏ½uοΏ½οΏ½οΏ½bοΏ½NοΏ½TοΏ½CοΏ½Y (2004.11.7 yutaka)
1006 // cf. 3DES=8, AES128=16
1007 return (pvar->ssh2_keys[MODE_IN].enc.block_size);
1008 }
1009 }
1010
1011 int CRYPT_get_encryption_block_size(PTInstVar pvar)
1012 {
1013 if (SSHv1(pvar)) {
1014 return 8;
1015 } else {
1016 // οΏ½pοΏ½PοΏ½bοΏ½gοΏ½οΏ½οΏ½MοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½SοΏ½οΏ½οΏ½YοΏ½οΏ½οΏ½οΏ½οΏ½uοΏ½οΏ½οΏ½bοΏ½NοΏ½TοΏ½CοΏ½Y (2004.11.7 yutaka)
1017 // cf. 3DES=8, AES128=16
1018 return (pvar->ssh2_keys[MODE_OUT].enc.block_size);
1019 }
1020 }
1021
1022 int CRYPT_get_receiver_MAC_size(PTInstVar pvar)
1023 {
1024 struct Mac *mac;
1025
1026 if (SSHv1(pvar)) {
1027 return 0;
1028
1029 } else { // for SSH2(yutaka)
1030 mac = &pvar->ssh2_keys[MODE_IN].mac;
1031 if (mac == NULL || mac->enabled == 0)
1032 return 0;
1033
1034 return (pvar->ssh2_keys[MODE_IN].mac.mac_len);
1035 }
1036
1037 }
1038
1039 // HMACοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½
1040 // οΏ½οΏ½οΏ½{οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½ SSH2 οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½gοΏ½pοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B
1041 // (2004.12.17 yutaka)
1042 BOOL CRYPT_verify_receiver_MAC(PTInstVar pvar, uint32 sequence_number,
1043 char FAR * data, int len, char FAR * MAC)
1044 {
1045 HMAC_CTX c;
1046 unsigned char m[EVP_MAX_MD_SIZE];
1047 unsigned char b[4];
1048 struct Mac *mac;
1049
1050 mac = &pvar->ssh2_keys[MODE_IN].mac;
1051
1052 // HMACοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½LοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½AοΏ½οΏ½οΏ½οΏ½OKοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½B
1053 if (mac == NULL || mac->enabled == 0)
1054 return TRUE;
1055
1056 if (mac->key == NULL)
1057 goto error;
1058
1059 if ((u_int)mac->mac_len > sizeof(m))
1060 goto error;
1061
1062 HMAC_Init(&c, mac->key, mac->key_len, mac->md);
1063 set_uint32_MSBfirst(b, sequence_number);
1064 HMAC_Update(&c, b, sizeof(b));
1065 HMAC_Update(&c, data, len);
1066 HMAC_Final(&c, m, NULL);
1067 HMAC_cleanup(&c);
1068
1069 if (memcmp(m, MAC, mac->mac_len)) {
1070 goto error;
1071 }
1072
1073 return TRUE;
1074
1075 error:
1076 return FALSE;
1077 }
1078
1079 int CRYPT_get_sender_MAC_size(PTInstVar pvar)
1080 {
1081 struct Mac *mac;
1082
1083 if (SSHv2(pvar)) { // for SSH2(yutaka)
1084 mac = &pvar->ssh2_keys[MODE_OUT].mac;
1085 if (mac == NULL || mac->enabled == 0)
1086 return 0;
1087
1088 return (mac->mac_len);
1089 }
1090
1091 return 0;
1092 }
1093
1094 // for SSH2
1095 BOOL CRYPT_build_sender_MAC(PTInstVar pvar, uint32 sequence_number,
1096 char FAR * data, int len, char FAR * MAC)
1097 {
1098 HMAC_CTX c;
1099 static u_char m[EVP_MAX_MD_SIZE];
1100 u_char b[4];
1101 struct Mac *mac;
1102
1103 if (SSHv2(pvar)) { // for SSH2(yutaka)
1104 mac = &pvar->ssh2_keys[MODE_OUT].mac;
1105 if (mac == NULL || mac->enabled == 0)
1106 return FALSE;
1107
1108 HMAC_Init(&c, mac->key, mac->key_len, mac->md);
1109 set_uint32_MSBfirst(b, sequence_number);
1110 HMAC_Update(&c, b, sizeof(b));
1111 HMAC_Update(&c, data, len);
1112 HMAC_Final(&c, m, NULL);
1113 HMAC_cleanup(&c);
1114
1115 // 20οΏ½oοΏ½CοΏ½gοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½RοΏ½sοΏ½[
1116 memcpy(MAC, m, pvar->ssh2_keys[MODE_OUT].mac.mac_len);
1117 // memcpy(MAC, m, sizeof(m));
1118
1119 return TRUE;
1120 }
1121
1122 return TRUE;
1123
1124 }
1125
1126 static int choose_cipher(PTInstVar pvar, int supported)
1127 {
1128 int i;
1129
1130 for (i = 0; pvar->session_settings.CipherOrder[i] != 0; i++) {
1131 int cipher = pvar->session_settings.CipherOrder[i] - '0';
1132
1133 if (cipher == SSH_CIPHER_NONE) {
1134 break;
1135 } else if ((supported & (1 << cipher)) != 0) {
1136 return cipher;
1137 }
1138 }
1139
1140 return SSH_CIPHER_NONE;
1141 }
1142
1143 BOOL CRYPT_choose_ciphers(PTInstVar pvar)
1144 {
1145 if (SSHv1(pvar)) {
1146 pvar->crypt_state.sender_cipher = choose_cipher(pvar,
1147 pvar->crypt_state.
1148 supported_sender_ciphers);
1149 pvar->crypt_state.receiver_cipher =
1150 choose_cipher(pvar, pvar->crypt_state.supported_receiver_ciphers);
1151
1152 } else { // SSH2(yutaka)
1153 pvar->crypt_state.sender_cipher = pvar->ctos_cipher;
1154 pvar->crypt_state.receiver_cipher =pvar->stoc_cipher;
1155
1156 }
1157
1158 if (pvar->crypt_state.sender_cipher == SSH_CIPHER_NONE
1159 || pvar->crypt_state.receiver_cipher == SSH_CIPHER_NONE) {
1160 UTIL_get_lang_msg("MSG_CHIPHER_NONE_ERROR", pvar,
1161 "All the encryption algorithms that this program and the server both understand have been disabled.\n"
1162 "To communicate with this server, you will have to enable some more ciphers\n"
1163 "in the TTSSH Setup dialog box when you run Tera Term again.\n"
1164 "This connection will now close.");
1165 notify_fatal_error(pvar, pvar->ts->UIMsg);
1166 return FALSE;
1167 } else {
1168 return TRUE;
1169 }
1170 }
1171
1172 int CRYPT_get_encrypted_session_key_len(PTInstVar pvar)
1173 {
1174 int server_key_bits =
1175 BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
1176 int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
1177 int server_key_bytes = (server_key_bits + 7) / 8;
1178 int host_key_bytes = (host_key_bits + 7) / 8;
1179
1180 if (server_key_bits < host_key_bits) {
1181 return host_key_bytes;
1182 } else {
1183 return server_key_bytes;
1184 }
1185 }
1186
1187 int CRYPT_choose_session_key(PTInstVar pvar,
1188 unsigned char FAR * encrypted_key_buf)
1189 {
1190 int server_key_bits =
1191 BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
1192 int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
1193 int server_key_bytes = (server_key_bits + 7) / 8;
1194 int host_key_bytes = (host_key_bits + 7) / 8;
1195 int encrypted_key_bytes;
1196 int bit_delta;
1197
1198 if (server_key_bits < host_key_bits) {
1199 encrypted_key_bytes = host_key_bytes;
1200 bit_delta = host_key_bits - server_key_bits;
1201 } else {
1202 encrypted_key_bytes = server_key_bytes;
1203 bit_delta = server_key_bits - host_key_bits;
1204 }
1205
1206 if (bit_delta < 128 || server_key_bits < 512 || host_key_bits < 512) {
1207 UTIL_get_lang_msg("MSG_RASKEY_TOOWEAK_ERROR", pvar,
1208 "Server RSA keys are too weak. A secure connection cannot be established.");
1209 notify_fatal_error(pvar, pvar->ts->UIMsg);
1210 return 0;
1211 } else {
1212 /* following Goldberg's code, I'm using MD5(servkey->n || hostkey->n || cookie)
1213 for the session ID, rather than the one specified in the RFC */
1214 int session_buf_len = server_key_bytes + host_key_bytes + 8;
1215 char FAR *session_buf = (char FAR *) malloc(session_buf_len);
1216 char session_id[16];
1217 int i;
1218
1219 BN_bn2bin(pvar->crypt_state.host_key.RSA_key->n, session_buf);
1220 BN_bn2bin(pvar->crypt_state.server_key.RSA_key->n,
1221 session_buf + host_key_bytes);
1222 memcpy(session_buf + server_key_bytes + host_key_bytes,
1223 pvar->crypt_state.server_cookie, 8);
1224 MD5(session_buf, session_buf_len, session_id);
1225
1226 free(session_buf);
1227
1228 RAND_bytes(pvar->crypt_state.sender_cipher_key,
1229 SSH_SESSION_KEY_LENGTH);
1230 memcpy(pvar->crypt_state.receiver_cipher_key,
1231 pvar->crypt_state.sender_cipher_key,
1232 SSH_SESSION_KEY_LENGTH);
1233
1234 memcpy(encrypted_key_buf + encrypted_key_bytes -
1235 SSH_SESSION_KEY_LENGTH, pvar->crypt_state.sender_cipher_key,
1236 SSH_SESSION_KEY_LENGTH);
1237 for (i = 0; i < sizeof(session_id); i++) {
1238 encrypted_key_buf[encrypted_key_bytes -
1239 SSH_SESSION_KEY_LENGTH + i]
1240 ^= session_id[i];
1241 }
1242
1243 if (host_key_bits > server_key_bits) {
1244 if (RSA_public_encrypt(SSH_SESSION_KEY_LENGTH,
1245 encrypted_key_buf +
1246 encrypted_key_bytes -
1247 SSH_SESSION_KEY_LENGTH,
1248 encrypted_key_buf +
1249 encrypted_key_bytes - server_key_bytes,
1250 pvar->crypt_state.server_key.RSA_key,
1251 RSA_PKCS1_PADDING) < 0)
1252 return 0;
1253
1254 if (RSA_public_encrypt(server_key_bytes,
1255 encrypted_key_buf +
1256 encrypted_key_bytes - server_key_bytes,
1257 encrypted_key_buf,
1258 pvar->crypt_state.host_key.RSA_key,
1259 RSA_PKCS1_PADDING) < 0)
1260 return 0;
1261 } else {
1262 if (RSA_public_encrypt(SSH_SESSION_KEY_LENGTH,
1263 encrypted_key_buf +
1264 encrypted_key_bytes -
1265 SSH_SESSION_KEY_LENGTH,
1266 encrypted_key_buf +
1267 encrypted_key_bytes - host_key_bytes,
1268 pvar->crypt_state.host_key.RSA_key,
1269 RSA_PKCS1_PADDING) < 0)
1270 return 0;
1271
1272 if (RSA_public_encrypt(host_key_bytes,
1273 encrypted_key_buf +
1274 encrypted_key_bytes - host_key_bytes,
1275 encrypted_key_buf,
1276 pvar->crypt_state.server_key.RSA_key,
1277 RSA_PKCS1_PADDING) < 0)
1278 return 0;
1279 }
1280 }
1281
1282 return 1;
1283 }
1284
1285 int CRYPT_generate_RSA_challenge_response(PTInstVar pvar,
1286 unsigned char FAR * challenge,
1287 int challenge_len,
1288 unsigned char FAR * response)
1289 {
1290 int server_key_bits =
1291 BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
1292 int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
1293 int server_key_bytes = (server_key_bits + 7) / 8;
1294 int host_key_bytes = (host_key_bits + 7) / 8;
1295 int session_buf_len = server_key_bytes + host_key_bytes + 8;
1296 char FAR *session_buf = (char FAR *) malloc(session_buf_len);
1297 char decrypted_challenge[48];
1298 int decrypted_challenge_len;
1299
1300 decrypted_challenge_len =
1301 RSA_private_decrypt(challenge_len, challenge, challenge,
1302 AUTH_get_cur_cred(pvar)->key_pair->rsa,
1303 RSA_PKCS1_PADDING);
1304 if (decrypted_challenge_len < 0) {
1305 free(session_buf);
1306 return 0;
1307 }
1308 if (decrypted_challenge_len >= SSH_RSA_CHALLENGE_LENGTH) {
1309 memcpy(decrypted_challenge,
1310 challenge + decrypted_challenge_len -
1311 SSH_RSA_CHALLENGE_LENGTH, SSH_RSA_CHALLENGE_LENGTH);
1312 } else {
1313 memset(decrypted_challenge, 0,
1314 SSH_RSA_CHALLENGE_LENGTH - decrypted_challenge_len);
1315 memcpy(decrypted_challenge + SSH_RSA_CHALLENGE_LENGTH -
1316 decrypted_challenge_len, challenge,
1317 decrypted_challenge_len);
1318 }
1319
1320 BN_bn2bin(pvar->crypt_state.host_key.RSA_key->n, session_buf);
1321 BN_bn2bin(pvar->crypt_state.server_key.RSA_key->n,
1322 session_buf + host_key_bytes);
1323 memcpy(session_buf + server_key_bytes + host_key_bytes,
1324 pvar->crypt_state.server_cookie, 8);
1325 MD5(session_buf, session_buf_len, decrypted_challenge + 32);
1326
1327 free(session_buf);
1328
1329 MD5(decrypted_challenge, 48, response);
1330
1331 return 1;
1332 }
1333
1334 static void c3DES_init(char FAR * session_key, Cipher3DESState FAR * state)
1335 {
1336 DES_set_key((const_DES_cblock FAR *) session_key, &state->k1);
1337 DES_set_key((const_DES_cblock FAR *) (session_key + 8), &state->k2);
1338 DES_set_key((const_DES_cblock FAR *) (session_key + 16), &state->k3);
1339 memset(state->ivec1, 0, 8);
1340 memset(state->ivec2, 0, 8);
1341 memset(state->ivec3, 0, 8);
1342 }
1343
1344 static void cDES_init(char FAR * session_key, CipherDESState FAR * state)
1345 {
1346 DES_set_key((const_des_cblock FAR *) session_key, &state->k);
1347 memset(state->ivec, 0, 8);
1348 }
1349
1350 static void cIDEA_init(char FAR * session_key, CipherIDEAState FAR * state)
1351 {
1352 idea_set_encrypt_key(session_key, &state->k);
1353 memset(state->ivec, 0, 8);
1354 }
1355
1356 static void cBlowfish_init(char FAR * session_key,
1357 CipherBlowfishState FAR * state)
1358 {
1359 BF_set_key(&state->k, 32, session_key);
1360 memset(state->ivec, 0, 8);
1361 }
1362
1363
1364 //
1365 // SSH2οΏ½pοΏ½AοΏ½οΏ½οΏ½SοΏ½οΏ½οΏ½YοΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½οΏ½
1366 //
1367 // for SSH2(yutaka)
1368 //
1369 void cipher_init_SSH2(EVP_CIPHER_CTX *evp,
1370 const u_char *key, u_int keylen,
1371 const u_char *iv, u_int ivlen,
1372 int encrypt,
1373 const EVP_CIPHER *type,
1374 int discard_len,
1375 PTInstVar pvar)
1376 {
1377 int klen;
1378 char tmp[80];
1379 unsigned char *junk = NULL, *discard = NULL;
1380
1381 EVP_CIPHER_CTX_init(evp);
1382 if (EVP_CipherInit(evp, type, NULL, (u_char *)iv, (encrypt == CIPHER_ENCRYPT)) == 0) {
1383 UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
1384 "Cipher initialize error(%d)");
1385 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 1);
1386 notify_fatal_error(pvar, tmp);
1387 return;
1388 }
1389
1390 klen = EVP_CIPHER_CTX_key_length(evp);
1391 if (klen > 0 && keylen != klen) {
1392 if (EVP_CIPHER_CTX_set_key_length(evp, keylen) == 0) {
1393 UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
1394 "Cipher initialize error(%d)");
1395 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 2);
1396 notify_fatal_error(pvar, tmp);
1397 return;
1398 }
1399 }
1400 if (EVP_CipherInit(evp, NULL, (u_char *)key, NULL, -1) == 0) {
1401 UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
1402 "Cipher initialize error(%d)");
1403 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, pvar->ts->UIMsg, 3);
1404 notify_fatal_error(pvar, tmp);
1405 return;
1406 }
1407
1408 if (discard_len > 0) {
1409 junk = malloc(discard_len);
1410 discard = malloc(discard_len);
1411 if (junk == NULL || discard == NULL ||
1412 EVP_Cipher(evp, discard, junk, discard_len) == 0) {
1413 UTIL_get_lang_msg("MSG_CIPHER_INIT_ERROR", pvar,
1414 "Cipher initialize error(%d)");
1415 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE,
1416 pvar->ts->UIMsg, 3);
1417 notify_fatal_error(pvar, tmp);
1418 }
1419 else {
1420 memset(discard, 0, discard_len);
1421 }
1422 free(junk);
1423 free(discard);
1424 }
1425 }
1426
1427
1428 BOOL CRYPT_start_encryption(PTInstVar pvar, int sender_flag, int receiver_flag)
1429 {
1430 char FAR *encryption_key = pvar->crypt_state.sender_cipher_key;
1431 char FAR *decryption_key = pvar->crypt_state.receiver_cipher_key;
1432 BOOL isOK = TRUE;
1433
1434 if (sender_flag) {
1435 switch (pvar->crypt_state.sender_cipher) {
1436 // for SSH2(yutaka)
1437 case SSH2_CIPHER_3DES_CBC:
1438 case SSH2_CIPHER_3DES_CTR:
1439 {
1440 struct Enc *enc;
1441
1442 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1443 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1444 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1445 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1446 CIPHER_ENCRYPT,
1447 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1448 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1449 pvar);
1450
1451 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1452 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1453
1454 pvar->crypt_state.encrypt = c3DES_encrypt2;
1455 break;
1456 }
1457
1458 // for SSH2(yutaka)
1459 case SSH2_CIPHER_AES128_CBC:
1460 case SSH2_CIPHER_AES192_CBC:
1461 case SSH2_CIPHER_AES256_CBC:
1462 case SSH2_CIPHER_AES128_CTR:
1463 case SSH2_CIPHER_AES192_CTR:
1464 case SSH2_CIPHER_AES256_CTR:
1465 {
1466 struct Enc *enc;
1467
1468 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1469 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1470 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1471 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1472 CIPHER_ENCRYPT,
1473 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1474 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1475 pvar);
1476
1477 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1478 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1479
1480 pvar->crypt_state.encrypt = cAES128_encrypt;
1481 break;
1482 }
1483
1484 case SSH2_CIPHER_BLOWFISH_CBC:
1485 case SSH2_CIPHER_BLOWFISH_CTR:
1486 {
1487 struct Enc *enc;
1488
1489 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1490 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1491 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1492 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1493 CIPHER_ENCRYPT,
1494 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1495 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1496 pvar);
1497
1498 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1499 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1500
1501 pvar->crypt_state.encrypt = cBlowfish_encrypt2;
1502 break;
1503 }
1504
1505 case SSH2_CIPHER_ARCFOUR:
1506 case SSH2_CIPHER_ARCFOUR128:
1507 case SSH2_CIPHER_ARCFOUR256:
1508 {
1509 struct Enc *enc;
1510
1511 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1512 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1513 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1514 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1515 CIPHER_ENCRYPT,
1516 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1517 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1518 pvar);
1519 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1520 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1521
1522 pvar->crypt_state.encrypt = cArcfour_encrypt;
1523 break;
1524 }
1525
1526 case SSH2_CIPHER_CAST128_CBC:
1527 case SSH2_CIPHER_CAST128_CTR:
1528 {
1529 struct Enc *enc;
1530
1531 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1532 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1533 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1534 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1535 CIPHER_ENCRYPT,
1536 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1537 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1538 pvar);
1539 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1540 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1541
1542 pvar->crypt_state.encrypt = cCast128_encrypt;
1543 break;
1544 }
1545
1546 #ifdef WITH_CAMELLIA_DRAFT
1547 case SSH2_CIPHER_CAMELLIA128_CBC:
1548 case SSH2_CIPHER_CAMELLIA192_CBC:
1549 case SSH2_CIPHER_CAMELLIA256_CBC:
1550 case SSH2_CIPHER_CAMELLIA128_CTR:
1551 case SSH2_CIPHER_CAMELLIA192_CTR:
1552 case SSH2_CIPHER_CAMELLIA256_CTR:
1553 {
1554 struct Enc *enc;
1555
1556 enc = &pvar->ssh2_keys[MODE_OUT].enc;
1557 cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1558 enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher),
1559 enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher),
1560 CIPHER_ENCRYPT,
1561 get_cipher_EVP_CIPHER(pvar->crypt_state.sender_cipher),
1562 get_cipher_discard_len(pvar->crypt_state.sender_cipher),
1563 pvar);
1564
1565 //debug_print(10, enc->key, get_cipher_key_len(pvar->crypt_state.sender_cipher));
1566 //debug_print(11, enc->iv, get_cipher_block_size(pvar->crypt_state.sender_cipher));
1567
1568 pvar->crypt_state.encrypt = cCamellia_encrypt;
1569 break;
1570 }
1571 #endif // WITH_CAMELLIA_DRAFT
1572
1573 case SSH_CIPHER_3DES:{
1574 c3DES_init(encryption_key, &pvar->crypt_state.enc.c3DES);
1575 pvar->crypt_state.encrypt = c3DES_encrypt;
1576 break;
1577 }
1578 case SSH_CIPHER_IDEA:{
1579 cIDEA_init(encryption_key, &pvar->crypt_state.enc.cIDEA);
1580 pvar->crypt_state.encrypt = cIDEA_encrypt;
1581 break;
1582 }
1583 case SSH_CIPHER_DES:{
1584 cDES_init(encryption_key, &pvar->crypt_state.enc.cDES);
1585 pvar->crypt_state.encrypt = cDES_encrypt;
1586 break;
1587 }
1588 case SSH_CIPHER_RC4:{
1589 RC4_set_key(&pvar->crypt_state.enc.cRC4.k, 16,
1590 encryption_key + 16);
1591 pvar->crypt_state.encrypt = cRC4_encrypt;
1592 break;
1593 }
1594 case SSH_CIPHER_BLOWFISH:{
1595 cBlowfish_init(encryption_key,
1596 &pvar->crypt_state.enc.cBlowfish);
1597 pvar->crypt_state.encrypt = cBlowfish_encrypt;
1598 break;
1599 }
1600 default:
1601 isOK = FALSE;
1602 }
1603 }
1604
1605
1606 if (receiver_flag) {
1607 switch (pvar->crypt_state.receiver_cipher) {
1608 // for SSH2(yutaka)
1609 case SSH2_CIPHER_3DES_CBC:
1610 case SSH2_CIPHER_3DES_CTR:
1611 {
1612 struct Enc *enc;
1613
1614 enc = &pvar->ssh2_keys[MODE_IN].enc;
1615 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1616 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1617 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1618 CIPHER_DECRYPT,
1619 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1620 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1621 pvar);
1622
1623 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1624 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1625
1626 pvar->crypt_state.decrypt = c3DES_decrypt2;
1627 break;
1628 }
1629
1630 // for SSH2(yutaka)
1631 case SSH2_CIPHER_AES128_CBC:
1632 case SSH2_CIPHER_AES192_CBC:
1633 case SSH2_CIPHER_AES256_CBC:
1634 case SSH2_CIPHER_AES128_CTR:
1635 case SSH2_CIPHER_AES192_CTR:
1636 case SSH2_CIPHER_AES256_CTR:
1637 {
1638 struct Enc *enc;
1639
1640 enc = &pvar->ssh2_keys[MODE_IN].enc;
1641 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1642 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1643 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1644 CIPHER_DECRYPT,
1645 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1646 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1647 pvar);
1648
1649 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1650 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1651
1652 pvar->crypt_state.decrypt = cAES128_decrypt;
1653 break;
1654 }
1655
1656 case SSH2_CIPHER_BLOWFISH_CBC:
1657 case SSH2_CIPHER_BLOWFISH_CTR:
1658 {
1659 struct Enc *enc;
1660
1661 enc = &pvar->ssh2_keys[MODE_IN].enc;
1662 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1663 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1664 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1665 CIPHER_DECRYPT,
1666 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1667 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1668 pvar);
1669
1670 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1671 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1672
1673 pvar->crypt_state.decrypt = cBlowfish_decrypt2;
1674 break;
1675 }
1676
1677 case SSH2_CIPHER_ARCFOUR:
1678 case SSH2_CIPHER_ARCFOUR128:
1679 case SSH2_CIPHER_ARCFOUR256:
1680 {
1681 struct Enc *enc;
1682
1683 enc = &pvar->ssh2_keys[MODE_IN].enc;
1684 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1685 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1686 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1687 CIPHER_DECRYPT,
1688 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1689 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1690 pvar);
1691
1692 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1693 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1694
1695 pvar->crypt_state.decrypt = cArcfour_decrypt;
1696 break;
1697 }
1698
1699 case SSH2_CIPHER_CAST128_CBC:
1700 case SSH2_CIPHER_CAST128_CTR:
1701 {
1702 struct Enc *enc;
1703
1704 enc = &pvar->ssh2_keys[MODE_IN].enc;
1705 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1706 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1707 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1708 CIPHER_DECRYPT,
1709 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1710 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1711 pvar);
1712
1713 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1714 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1715
1716 pvar->crypt_state.decrypt = cCast128_decrypt;
1717 break;
1718 }
1719
1720 #ifdef WITH_CAMELLIA_DRAFT
1721 case SSH2_CIPHER_CAMELLIA128_CBC:
1722 case SSH2_CIPHER_CAMELLIA192_CBC:
1723 case SSH2_CIPHER_CAMELLIA256_CBC:
1724 case SSH2_CIPHER_CAMELLIA128_CTR:
1725 case SSH2_CIPHER_CAMELLIA192_CTR:
1726 case SSH2_CIPHER_CAMELLIA256_CTR:
1727 {
1728 struct Enc *enc;
1729
1730 enc = &pvar->ssh2_keys[MODE_IN].enc;
1731 cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1732 enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher),
1733 enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher),
1734 CIPHER_DECRYPT,
1735 get_cipher_EVP_CIPHER(pvar->crypt_state.receiver_cipher),
1736 get_cipher_discard_len(pvar->crypt_state.receiver_cipher),
1737 pvar);
1738
1739 //debug_print(12, enc->key, get_cipher_key_len(pvar->crypt_state.receiver_cipher));
1740 //debug_print(13, enc->iv, get_cipher_block_size(pvar->crypt_state.receiver_cipher));
1741
1742 pvar->crypt_state.decrypt = cCamellia_decrypt;
1743 break;
1744 }
1745 #endif // WITH_CAMELLIA_DRAFT
1746
1747 case SSH_CIPHER_3DES:{
1748 c3DES_init(decryption_key, &pvar->crypt_state.dec.c3DES);
1749 pvar->crypt_state.decrypt = c3DES_decrypt;
1750 break;
1751 }
1752 case SSH_CIPHER_IDEA:{
1753 cIDEA_init(decryption_key, &pvar->crypt_state.dec.cIDEA);
1754 pvar->crypt_state.decrypt = cIDEA_decrypt;
1755 break;
1756 }
1757 case SSH_CIPHER_DES:{
1758 cDES_init(decryption_key, &pvar->crypt_state.dec.cDES);
1759 pvar->crypt_state.decrypt = cDES_decrypt;
1760 break;
1761 }
1762 case SSH_CIPHER_RC4:{
1763 RC4_set_key(&pvar->crypt_state.dec.cRC4.k, 16, decryption_key);
1764 pvar->crypt_state.decrypt = cRC4_decrypt;
1765 break;
1766 }
1767 case SSH_CIPHER_BLOWFISH:{
1768 cBlowfish_init(decryption_key,
1769 &pvar->crypt_state.dec.cBlowfish);
1770 pvar->crypt_state.decrypt = cBlowfish_decrypt;
1771 break;
1772 }
1773 default:
1774 isOK = FALSE;
1775 }
1776 }
1777
1778
1779 if (!isOK) {
1780 UTIL_get_lang_msg("MSG_CHPHER_NOTSELECTED_ERROR", pvar,
1781 "No cipher selected!");
1782 notify_fatal_error(pvar, pvar->ts->UIMsg);
1783 return FALSE;
1784 } else {
1785 memset(encryption_key, 0, CRYPT_KEY_LENGTH);
1786 memset(decryption_key, 0, CRYPT_KEY_LENGTH);
1787 return TRUE;
1788 }
1789 }
1790
1791 void CRYPT_init(PTInstVar pvar)
1792 {
1793 pvar->crypt_state.encrypt = no_encrypt;
1794 pvar->crypt_state.decrypt = no_encrypt;
1795 pvar->crypt_state.sender_cipher = SSH_CIPHER_NONE;
1796 pvar->crypt_state.receiver_cipher = SSH_CIPHER_NONE;
1797 pvar->crypt_state.server_key.RSA_key = NULL;
1798 pvar->crypt_state.host_key.RSA_key = NULL;
1799
1800 pvar->crypt_state.detect_attack_statics.h = NULL;
1801 pvar->crypt_state.detect_attack_statics.n =
1802 HASH_MINSIZE / HASH_ENTRYSIZE;
1803 }
1804
1805 static char FAR *get_cipher_name(int cipher)
1806 {
1807 switch (cipher) {
1808 case SSH_CIPHER_NONE:
1809 return "None";
1810 case SSH_CIPHER_3DES:
1811 return "3DES (168 key bits)";
1812 case SSH_CIPHER_DES:
1813 return "DES (56 key bits)";
1814 case SSH_CIPHER_IDEA:
1815 return "IDEA (128 key bits)";
1816 case SSH_CIPHER_RC4:
1817 return "RC4 (128 key bits)";
1818 case SSH_CIPHER_BLOWFISH:
1819 return "Blowfish (256 key bits)";
1820
1821 // SSH2
1822 case SSH2_CIPHER_3DES_CBC:
1823 return "3DES-CBC";
1824 case SSH2_CIPHER_AES128_CBC:
1825 return "AES128-CBC";
1826 case SSH2_CIPHER_AES192_CBC:
1827 return "AES192-CBC";
1828 case SSH2_CIPHER_AES256_CBC:
1829 return "AES256-CBC";
1830 case SSH2_CIPHER_BLOWFISH_CBC:
1831 return "Blowfish-CBC";
1832 case SSH2_CIPHER_AES128_CTR:
1833 return "AES128-CTR";
1834 case SSH2_CIPHER_AES192_CTR:
1835 return "AES192-CTR";
1836 case SSH2_CIPHER_AES256_CTR:
1837 return "AES256-CTR";
1838 case SSH2_CIPHER_ARCFOUR:
1839 return "Arcfour";
1840 case SSH2_CIPHER_ARCFOUR128:
1841 return "Arcfour128";
1842 case SSH2_CIPHER_ARCFOUR256:
1843 return "Arcfour256";
1844 case SSH2_CIPHER_CAST128_CBC:
1845 return "CAST-128-CBC";
1846 case SSH2_CIPHER_3DES_CTR:
1847 return "3DES-CTR";
1848 case SSH2_CIPHER_BLOWFISH_CTR:
1849 return "Blowfish-CTR";
1850 case SSH2_CIPHER_CAST128_CTR:
1851 return "CAST-128-CTR";
1852 #ifdef WITH_CAMELLIA_DRAFT
1853 case SSH2_CIPHER_CAMELLIA128_CBC:
1854 return "Camellia128-CBC";
1855 case SSH2_CIPHER_CAMELLIA192_CBC:
1856 return "Camellia192-CBC";
1857 case SSH2_CIPHER_CAMELLIA256_CBC:
1858 return "Camellia256-CBC";
1859 case SSH2_CIPHER_CAMELLIA128_CTR:
1860 return "Camellia128-CTR";
1861 case SSH2_CIPHER_CAMELLIA192_CTR:
1862 return "Camellia192-CTR";
1863 case SSH2_CIPHER_CAMELLIA256_CTR:
1864 return "Camellia256-CTR";
1865 #endif // WITH_CAMELLIA_DRAFT
1866
1867 default:
1868 return "Unknown";
1869 }
1870 }
1871
1872 void CRYPT_get_cipher_info(PTInstVar pvar, char FAR * dest, int len)
1873 {
1874 UTIL_get_lang_msg("DLG_ABOUT_CIPHER_INFO", pvar,
1875 "%s to server, %s from server");
1876 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1877 get_cipher_name(pvar->crypt_state.sender_cipher),
1878 get_cipher_name(pvar->crypt_state.receiver_cipher));
1879 }
1880
1881 void CRYPT_get_server_key_info(PTInstVar pvar, char FAR * dest, int len)
1882 {
1883 if (SSHv1(pvar)) {
1884 if (pvar->crypt_state.server_key.RSA_key == NULL
1885 || pvar->crypt_state.host_key.RSA_key == NULL) {
1886 UTIL_get_lang_msg("DLG_ABOUT_KEY_NONE", pvar, "None");
1887 strncpy_s(dest, len, pvar->ts->UIMsg, _TRUNCATE);
1888 } else {
1889 UTIL_get_lang_msg("DLG_ABOUT_KEY_INFO", pvar,
1890 "%d-bit server key, %d-bit host key");
1891 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1892 BN_num_bits(pvar->crypt_state.server_key.RSA_key->n),
1893 BN_num_bits(pvar->crypt_state.host_key.RSA_key->n));
1894 }
1895 } else { // SSH2
1896 UTIL_get_lang_msg("DLG_ABOUT_KEY_INFO2", pvar,
1897 "%d-bit client key, %d-bit server key");
1898 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1899 pvar->client_key_bits,
1900 pvar->server_key_bits);
1901 }
1902 }
1903
1904 static void destroy_public_key(CRYPTPublicKey * key)
1905 {
1906 if (key->RSA_key != NULL) {
1907 RSA_free(key->RSA_key);
1908 key->RSA_key = NULL;
1909 }
1910 }
1911
1912 void CRYPT_free_public_key(CRYPTPublicKey * key)
1913 {
1914 destroy_public_key(key);
1915 free(key);
1916 }
1917
1918 void CRYPT_end(PTInstVar pvar)
1919 {
1920 destroy_public_key(&pvar->crypt_state.host_key);
1921 destroy_public_key(&pvar->crypt_state.server_key);
1922
1923 if (pvar->crypt_state.detect_attack_statics.h != NULL) {
1924 memset(pvar->crypt_state.detect_attack_statics.h, 0,
1925 pvar->crypt_state.detect_attack_statics.n * HASH_ENTRYSIZE);
1926 free(pvar->crypt_state.detect_attack_statics.h);
1927 }
1928
1929 memset(pvar->crypt_state.sender_cipher_key, 0,
1930 sizeof(pvar->crypt_state.sender_cipher_key));
1931 memset(pvar->crypt_state.receiver_cipher_key, 0,
1932 sizeof(pvar->crypt_state.receiver_cipher_key));
1933 memset(pvar->crypt_state.server_cookie, 0,
1934 sizeof(pvar->crypt_state.server_cookie));
1935 memset(pvar->crypt_state.client_cookie, 0,
1936 sizeof(pvar->crypt_state.client_cookie));
1937 memset(&pvar->crypt_state.enc, 0, sizeof(pvar->crypt_state.enc));
1938 memset(&pvar->crypt_state.dec, 0, sizeof(pvar->crypt_state.dec));
1939 }
1940
1941 int CRYPT_passphrase_decrypt(int cipher, char FAR * passphrase,
1942 char FAR * buf, int bytes)
1943 {
1944 unsigned char passphrase_key[16];
1945
1946 MD5(passphrase, strlen(passphrase), passphrase_key);
1947
1948 switch (cipher) {
1949 case SSH_CIPHER_3DES:{
1950 Cipher3DESState state;
1951
1952 DES_set_key((const_DES_cblock FAR *) passphrase_key,
1953 &state.k1);
1954 DES_set_key((const_DES_cblock FAR *) (passphrase_key + 8),
1955 &state.k2);
1956 DES_set_key((const_DES_cblock FAR *) passphrase_key,
1957 &state.k3);
1958 memset(state.ivec1, 0, 8);
1959 memset(state.ivec2, 0, 8);
1960 memset(state.ivec3, 0, 8);
1961 DES_ncbc_encrypt(buf, buf, bytes,
1962 &state.k3, &state.ivec3, DES_DECRYPT);
1963 DES_ncbc_encrypt(buf, buf, bytes,
1964 &state.k2, &state.ivec2, DES_ENCRYPT);
1965 DES_ncbc_encrypt(buf, buf, bytes,
1966 &state.k1, &state.ivec1, DES_DECRYPT);
1967 break;
1968 }
1969
1970 case SSH_CIPHER_IDEA:{
1971 CipherIDEAState state;
1972 int num = 0;
1973
1974 cIDEA_init(passphrase_key, &state);
1975 idea_cfb64_encrypt(buf, buf, bytes, &state.k, state.ivec,
1976 &num, IDEA_DECRYPT);
1977 break;
1978 }
1979
1980 case SSH_CIPHER_DES:{
1981 CipherDESState state;
1982
1983 cDES_init(passphrase_key, &state);
1984 DES_ncbc_encrypt(buf, buf, bytes,
1985 &state.k, &state.ivec, DES_DECRYPT);
1986 break;
1987 }
1988
1989 case SSH_CIPHER_RC4:{
1990 CipherRC4State state;
1991 int num = 0;
1992
1993 RC4_set_key(&state.k, 16, passphrase_key);
1994 RC4(&state.k, bytes, buf, buf);
1995 break;
1996 }
1997
1998 case SSH_CIPHER_BLOWFISH:{
1999 CipherBlowfishState state;
2000
2001 BF_set_key(&state.k, 16, passphrase_key);
2002 memset(state.ivec, 0, 8);
2003 flip_endianness(buf, bytes);
2004 BF_cbc_encrypt(buf, buf, bytes, &state.k, state.ivec,
2005 BF_DECRYPT);
2006 flip_endianness(buf, bytes);
2007 break;
2008 }
2009
2010 case SSH_CIPHER_NONE:
2011 break;
2012
2013 default:
2014 memset(passphrase_key, 0, sizeof(passphrase_key));
2015 return 0;
2016 }
2017
2018 memset(passphrase_key, 0, sizeof(passphrase_key));
2019 return 1;
2020 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26