Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2728 - (hide annotations) (download) (as text)
Sun Nov 14 15:53:21 2004 UTC (19 years, 5 months ago) by yutakakn
Original Path: ttssh2/branches/avendor/ttxssh/crypt.c
File MIME type: text/x-csrc
File size: 35741 byte(s)
no message

1 yutakakn 2728 /*
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 "cipher.h"
41     #include "ssh.h"
42    
43     #define do_crc(buf, len) (~(uint32)crc32(0xFFFFFFFF, (buf), (len)))
44     #define get_uint32(buf) get_uint32_MSBfirst((buf))
45    
46     #define DEATTACK_OK 0
47     #define DEATTACK_DETECTED 1
48    
49     /*
50     * $Id: crypt.c,v 1.1.1.1 2004-11-14 15:53:14 yutakakn Exp $ Cryptographic attack
51     * detector for ssh - source code (C)1998 CORE-SDI, Buenos Aires Argentina
52     * Ariel Futoransky(futo@core-sdi.com) <http://www.core-sdi.com>
53     */
54    
55     /* SSH Constants */
56     #define SSH_BLOCKSIZE 8
57    
58     /* Hashing constants */
59     #define HASH_MINSIZE 8*2048
60     #define HASH_ENTRYSIZE 4
61     #define HASH_FACTOR(x) ((x)*3/2)
62     #define HASH_UNUSEDCHAR 0xff
63     #define HASH_UNUSED 0xffffffff
64     #define HASH_IV 0xfffffffe
65    
66     #define HASH_MINBLOCKS (7*SSH_BLOCKSIZE)
67    
68     /* Hash function (Input keys are cipher results) */
69     #define HASH(x) get_uint32(x)
70    
71     #define CMP(a,b) memcmp(a, b, SSH_BLOCKSIZE)
72    
73    
74    
75     static void crc_update(uint32 FAR * a, uint32 b)
76     {
77     b ^= *a;
78     *a = do_crc((unsigned char FAR *) &b, sizeof(b));
79     }
80    
81     /* check_crc
82     detects if a block is used in a particular pattern
83     */
84    
85     static int check_crc(unsigned char FAR * S, unsigned char FAR * buf,
86     uint32 len, unsigned char FAR * IV)
87     {
88     uint32 crc;
89     unsigned char FAR *c;
90    
91     crc = 0;
92     if (IV && !CMP(S, IV)) {
93     crc_update(&crc, 1);
94     crc_update(&crc, 0);
95     }
96     for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
97     if (!CMP(S, c)) {
98     crc_update(&crc, 1);
99     crc_update(&crc, 0);
100     } else {
101     crc_update(&crc, 0);
102     crc_update(&crc, 0);
103     }
104     }
105    
106     return crc == 0;
107     }
108    
109    
110     /*
111     detect_attack
112     Detects a crc32 compensation attack on a packet
113     */
114     static int detect_attack(CRYPTDetectAttack FAR * statics,
115     unsigned char FAR * buf, uint32 len,
116     unsigned char *FAR IV)
117     {
118     uint32 FAR *h = statics->h;
119     uint32 n = statics->n;
120     uint32 i, j;
121     uint32 l;
122     unsigned char FAR *c;
123     unsigned char FAR *d;
124    
125     for (l = n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2) {
126     }
127    
128     if (h == NULL) {
129     n = l;
130     h = (uint32 FAR *) malloc(n * HASH_ENTRYSIZE);
131     } else {
132     if (l > n) {
133     n = l;
134     h = (uint32 FAR *) realloc(h, n * HASH_ENTRYSIZE);
135     }
136     }
137    
138     statics->h = h;
139     statics->n = n;
140    
141     if (len <= HASH_MINBLOCKS) {
142     for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) {
143     if (IV && (!CMP(c, IV))) {
144     if ((check_crc(c, buf, len, IV)))
145     return DEATTACK_DETECTED;
146     else
147     break;
148     }
149     for (d = buf; d < c; d += SSH_BLOCKSIZE) {
150     if (!CMP(c, d)) {
151     if ((check_crc(c, buf, len, IV)))
152     return DEATTACK_DETECTED;
153     else
154     break;
155     }
156     }
157     }
158     return (DEATTACK_OK);
159     }
160     memset(h, HASH_UNUSEDCHAR, n * HASH_ENTRYSIZE);
161    
162     if (IV) {
163     h[HASH(IV) & (n - 1)] = HASH_IV;
164     }
165    
166     for (c = buf, j = 0; c < (buf + len); c += SSH_BLOCKSIZE, j++) {
167     for (i = HASH(c) & (n - 1); h[i] != HASH_UNUSED;
168     i = (i + 1) & (n - 1)) {
169     if (h[i] == HASH_IV) {
170     if (!CMP(c, IV)) {
171     if (check_crc(c, buf, len, IV))
172     return DEATTACK_DETECTED;
173     else
174     break;
175     }
176     } else if (!CMP(c, buf + h[i] * SSH_BLOCKSIZE)) {
177     if (check_crc(c, buf, len, IV))
178     return DEATTACK_DETECTED;
179     else
180     break;
181     }
182     }
183     h[i] = j;
184     }
185    
186     return DEATTACK_OK;
187     }
188    
189     BOOL CRYPT_detect_attack(PTInstVar pvar, unsigned char FAR * buf,
190     int bytes)
191     {
192     if (SSHv1(pvar)) {
193     switch (pvar->crypt_state.sender_cipher) {
194     case SSH_CIPHER_NONE:
195     return FALSE;
196     case SSH_CIPHER_IDEA:
197     return detect_attack(&pvar->crypt_state.detect_attack_statics,
198     buf, bytes,
199     pvar->crypt_state.dec.cIDEA.ivec) ==
200     DEATTACK_DETECTED;
201     default:
202     return detect_attack(&pvar->crypt_state.detect_attack_statics,
203     buf, bytes, NULL) == DEATTACK_DETECTED;
204     }
205     } else {
206     return FALSE;
207     }
208     }
209    
210     static void no_encrypt(PTInstVar pvar, unsigned char FAR * buf, int bytes)
211     {
212     }
213    
214    
215     // for SSH2(yutaka)
216     static void cAES128_encrypt(PTInstVar pvar, unsigned char FAR * buf,
217     int bytes)
218     {
219     // unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN];
220     unsigned char *newbuf = malloc(bytes);
221     int block_size = pvar->ssh2_keys[MODE_OUT].enc.block_size;
222    
223     // ���O�������������A�S�y�C���[�h�������������������������A0�o�C�g�������B(2004.11.7 yutaka)
224     if (bytes == 0)
225     return;
226    
227     if (newbuf == NULL)
228     return;
229    
230     if (bytes % block_size) {
231     char tmp[80];
232     _snprintf(tmp, sizeof(tmp), "AES128 encrypt error(1): bytes %d (%d)", bytes, block_size);
233     notify_fatal_error(pvar, tmp);
234     goto error;
235     }
236    
237     if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
238     // TODO: failure
239     notify_fatal_error(pvar, "AES128 encrypt error(2)");
240    
241     } else {
242     //memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, AES128_KEYLEN);
243     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
244     //memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, AES128_IVLEN);
245    
246     //debug_print(50, key, 24);
247     //debug_print(51, iv, 8);
248     //debug_print(52, buf, bytes);
249     //debug_print(53, newbuf, bytes);
250    
251     memcpy(buf, newbuf, bytes);
252     }
253    
254     error:
255     free(newbuf);
256     }
257    
258     static void cAES128_decrypt(PTInstVar pvar, unsigned char FAR * buf,
259     int bytes)
260     {
261     // unsigned char key[AES128_KEYLEN], iv[AES128_IVLEN];
262     unsigned char *newbuf = malloc(bytes);
263     int block_size = pvar->ssh2_keys[MODE_IN].enc.block_size;
264    
265     // ���O�������������A�S�y�C���[�h�������������������������A0�o�C�g�������B(2004.11.7 yutaka)
266     if (bytes == 0)
267     return;
268    
269     if (newbuf == NULL)
270     return;
271    
272     if (bytes % block_size) {
273     char tmp[80];
274     _snprintf(tmp, sizeof(tmp), "AES128 decrypt error(1): bytes %d (%d)", bytes, block_size);
275     notify_fatal_error(pvar, tmp);
276     goto error;
277     }
278    
279     if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
280     // TODO:
281     notify_fatal_error(pvar, "AES128 decrypt error(2)");
282    
283     } else {
284     #if 0
285     memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, AES128_KEYLEN);
286     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
287     memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, AES128_IVLEN);
288    
289     {
290     static int no = 70;
291     debug_print(no, buf, bytes);
292     //debug_print(no, key, AES128_KEYLEN);
293     //debug_print(10*no, iv, AES128_IVLEN);
294     debug_print(30*no, newbuf, bytes);
295     no++;
296     }
297     #endif
298    
299     memcpy(buf, newbuf, bytes);
300     }
301    
302     error:;
303     free(newbuf);
304     }
305    
306    
307    
308     // for SSH2(yutaka)
309     static void c3DES_CBC_encrypt(PTInstVar pvar, unsigned char FAR * buf,
310     int bytes)
311     {
312     unsigned char key[24], iv[8];
313     unsigned char *newbuf = malloc(bytes);
314    
315     if (newbuf == NULL)
316     return;
317    
318     #if 1
319    
320     if (EVP_Cipher(&pvar->evpcip[MODE_OUT], newbuf, buf, bytes) == 0) {
321     // TODO: failure
322     } else {
323     memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, 24);
324     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
325     memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, 8);
326    
327     //debug_print(50, key, 24);
328     //debug_print(51, iv, 8);
329     //debug_print(52, buf, bytes);
330     //debug_print(53, newbuf, bytes);
331    
332     memcpy(buf, newbuf, bytes);
333     }
334     free(newbuf);
335     #else
336    
337     memcpy(key, pvar->ssh2_keys[MODE_OUT].enc.key, 24);
338     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
339     memcpy(iv, pvar->ssh2_keys[MODE_OUT].enc.iv, 8);
340    
341     //debug_print(50, key, 24);
342     //debug_print(51, iv, 8);
343     //debug_print(52, buf, bytes);
344    
345     #if 0
346     DES_ede3_cbc_encrypt(
347     buf, newbuf, bytes,
348     (DES_key_schedule *)&key[0],
349     (DES_key_schedule *)&key[8],
350     (DES_key_schedule *)&key[16],
351     (DES_cblock *)iv,
352     DES_ENCRYPT);
353     #else
354     DES_ncbc_encrypt(buf, newbuf, bytes, (DES_key_schedule *)&key[0], (DES_cblock *)iv, DES_ENCRYPT);
355     DES_ncbc_encrypt(buf, newbuf, bytes, (DES_key_schedule *)&key[8], (DES_cblock *)iv, DES_DECRYPT);
356     DES_ncbc_encrypt(buf, newbuf, bytes, (DES_key_schedule *)&key[16], (DES_cblock *)iv, DES_ENCRYPT);
357    
358     #endif
359    
360     //debug_print(53, newbuf, bytes);
361    
362     memcpy(buf, newbuf, bytes);
363     free(newbuf);
364    
365     #endif
366     }
367    
368     static void c3DES_CBC_decrypt(PTInstVar pvar, unsigned char FAR * buf,
369     int bytes)
370     {
371     unsigned char key[24], iv[8];
372     unsigned char *newbuf = malloc(bytes);
373    
374     if (newbuf == NULL)
375     return;
376    
377     #if 1
378     if (EVP_Cipher(&pvar->evpcip[MODE_IN], newbuf, buf, bytes) == 0) {
379     // TODO:
380    
381     } else {
382     memcpy(key, pvar->ssh2_keys[MODE_IN].enc.key, 24);
383     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
384     memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, 8);
385    
386     //debug_print(70, key, 24);
387     //debug_print(71, iv, 8);
388     //debug_print(72, buf, bytes);
389     //debug_print(73, newbuf, bytes);
390    
391     memcpy(buf, newbuf, bytes);
392     }
393     free(newbuf);
394    
395     #else
396     unsigned char *key, iv[8];
397     unsigned char *newbuf = malloc(bytes);
398     if (newbuf == NULL)
399     return;
400    
401     key = pvar->ssh2_keys[MODE_IN].enc.key;
402     // IV��DES���������X�V�����������A���[�J�����R�s�[���������g���B
403     memcpy(iv, pvar->ssh2_keys[MODE_IN].enc.iv, 8);
404    
405     //debug_print(60, key, 24);
406     //debug_print(61, iv, 8);
407     //debug_print(62, buf, bytes);
408    
409     DES_ede3_cbc_encrypt(
410     buf, newbuf, bytes,
411     (DES_key_schedule *)&key[0],
412     (DES_key_schedule *)&key[8],
413     (DES_key_schedule *)&key[16],
414     (DES_cblock *)iv,
415     DES_DECRYPT);
416    
417     //debug_print(63, newbuf, bytes);
418    
419     memcpy(buf, newbuf, bytes);
420    
421     free(newbuf);
422     #endif
423     }
424    
425    
426     static void c3DES_encrypt(PTInstVar pvar, unsigned char FAR * buf,
427     int bytes)
428     {
429     Cipher3DESState FAR *encryptstate = &pvar->crypt_state.enc.c3DES;
430    
431     DES_ncbc_encrypt(buf, buf, bytes,
432     &encryptstate->k1, &encryptstate->ivec1, DES_ENCRYPT);
433     DES_ncbc_encrypt(buf, buf, bytes,
434     &encryptstate->k2, &encryptstate->ivec2, DES_DECRYPT);
435     DES_ncbc_encrypt(buf, buf, bytes,
436     &encryptstate->k3, &encryptstate->ivec3, DES_ENCRYPT);
437     }
438    
439     static void c3DES_decrypt(PTInstVar pvar, unsigned char FAR * buf,
440     int bytes)
441     {
442     Cipher3DESState FAR *decryptstate = &pvar->crypt_state.dec.c3DES;
443    
444     DES_ncbc_encrypt(buf, buf, bytes,
445     &decryptstate->k3, &decryptstate->ivec3, DES_DECRYPT);
446     DES_ncbc_encrypt(buf, buf, bytes,
447     &decryptstate->k2, &decryptstate->ivec2, DES_ENCRYPT);
448     DES_ncbc_encrypt(buf, buf, bytes,
449     &decryptstate->k1, &decryptstate->ivec1, DES_DECRYPT);
450     }
451    
452     static void cDES_encrypt(PTInstVar pvar, unsigned char FAR * buf,
453     int bytes)
454     {
455     CipherDESState FAR *encryptstate = &pvar->crypt_state.enc.cDES;
456    
457     DES_ncbc_encrypt(buf, buf, bytes,
458     &encryptstate->k, &encryptstate->ivec, DES_ENCRYPT);
459     }
460    
461     static void cDES_decrypt(PTInstVar pvar, unsigned char FAR * buf,
462     int bytes)
463     {
464     CipherDESState FAR *decryptstate = &pvar->crypt_state.dec.cDES;
465    
466     DES_ncbc_encrypt(buf, buf, bytes,
467     &decryptstate->k, &decryptstate->ivec, DES_DECRYPT);
468     }
469    
470     static void cIDEA_encrypt(PTInstVar pvar, unsigned char FAR * buf,
471     int bytes)
472     {
473     CipherIDEAState FAR *encryptstate = &pvar->crypt_state.enc.cIDEA;
474     int num = 0;
475    
476     idea_cfb64_encrypt(buf, buf, bytes, &encryptstate->k,
477     encryptstate->ivec, &num, IDEA_ENCRYPT);
478     }
479    
480     static void cIDEA_decrypt(PTInstVar pvar, unsigned char FAR * buf,
481     int bytes)
482     {
483     CipherIDEAState FAR *decryptstate = &pvar->crypt_state.dec.cIDEA;
484     int num = 0;
485    
486     idea_cfb64_encrypt(buf, buf, bytes, &decryptstate->k,
487     decryptstate->ivec, &num, IDEA_DECRYPT);
488     }
489    
490     static void flip_endianness(unsigned char FAR * cbuf, int bytes)
491     {
492     uint32 FAR *buf = (uint32 FAR *) cbuf;
493     int count = bytes / 4;
494    
495     while (count > 0) {
496     uint32 w = *buf;
497    
498     *buf = ((w << 24) & 0xFF000000) | ((w << 8) & 0x00FF0000)
499     | ((w >> 8) & 0x0000FF00) | ((w >> 24) & 0x000000FF);
500     count--;
501     buf++;
502     }
503     }
504    
505     static void cBlowfish_encrypt(PTInstVar pvar, unsigned char FAR * buf,
506     int bytes)
507     {
508     CipherBlowfishState FAR *encryptstate =
509     &pvar->crypt_state.enc.cBlowfish;
510    
511     flip_endianness(buf, bytes);
512     BF_cbc_encrypt(buf, buf, bytes, &encryptstate->k, encryptstate->ivec,
513     BF_ENCRYPT);
514     flip_endianness(buf, bytes);
515     }
516    
517     static void cBlowfish_decrypt(PTInstVar pvar, unsigned char FAR * buf,
518     int bytes)
519     {
520     CipherBlowfishState FAR *decryptstate =
521     &pvar->crypt_state.dec.cBlowfish;
522    
523     flip_endianness(buf, bytes);
524     BF_cbc_encrypt(buf, buf, bytes, &decryptstate->k, decryptstate->ivec,
525     BF_DECRYPT);
526     flip_endianness(buf, bytes);
527     }
528    
529     static void cRC4_encrypt(PTInstVar pvar, unsigned char FAR * buf,
530     int bytes)
531     {
532     CipherRC4State FAR *encryptstate = &pvar->crypt_state.enc.cRC4;
533     int num = 0;
534    
535     RC4(&encryptstate->k, bytes, buf, buf);
536     }
537    
538     static void cRC4_decrypt(PTInstVar pvar, unsigned char FAR * buf,
539     int bytes)
540     {
541     CipherRC4State FAR *decryptstate = &pvar->crypt_state.dec.cRC4;
542     int num = 0;
543    
544     RC4(&decryptstate->k, bytes, buf, buf);
545     }
546    
547     void CRYPT_set_random_data(PTInstVar pvar, unsigned char FAR * buf,
548     int bytes)
549     {
550     RAND_bytes(buf, bytes);
551     }
552    
553     void CRYPT_initialize_random_numbers(PTInstVar pvar)
554     {
555     RAND_screen();
556     }
557    
558     static BIGNUM FAR *get_bignum(unsigned char FAR * bytes)
559     {
560     int bits = get_ushort16_MSBfirst(bytes);
561    
562     return BN_bin2bn(bytes + 2, (bits + 7) / 8, NULL);
563     }
564    
565     static RSA FAR *make_key(PTInstVar pvar,
566     int bits, unsigned char FAR * exp,
567     unsigned char FAR * mod)
568     {
569     RSA FAR *key = RSA_new();
570    
571     if (key != NULL) {
572     key->e = get_bignum(exp);
573     key->n = get_bignum(mod);
574     }
575    
576     if (key == NULL || key->e == NULL || key->n == NULL) {
577     notify_fatal_error(pvar, "Error setting up RSA keys");
578    
579     if (key != NULL) {
580     if (key->e != NULL) {
581     BN_free(key->e);
582     }
583     if (key->n != NULL) {
584     BN_free(key->n);
585     }
586     RSA_free(key);
587     }
588    
589     return NULL;
590     } else {
591     return key;
592     }
593     }
594    
595     void CRYPT_set_server_cookie(PTInstVar pvar, unsigned char FAR * cookie)
596     {
597     if (SSHv1(pvar)) {
598     memcpy(pvar->crypt_state.server_cookie, cookie, SSH_COOKIE_LENGTH);
599     } else {
600     memcpy(pvar->crypt_state.server_cookie, cookie,
601     SSH2_COOKIE_LENGTH);
602     }
603     }
604    
605     void CRYPT_set_client_cookie(PTInstVar pvar, unsigned char FAR * cookie)
606     {
607     if (SSHv2(pvar)) {
608     memcpy(pvar->crypt_state.client_cookie, cookie,
609     SSH2_COOKIE_LENGTH);
610     }
611     }
612    
613     BOOL CRYPT_set_server_RSA_key(PTInstVar pvar,
614     int bits, unsigned char FAR * exp,
615     unsigned char FAR * mod)
616     {
617     pvar->crypt_state.server_key.RSA_key = make_key(pvar, bits, exp, mod);
618    
619     return pvar->crypt_state.server_key.RSA_key != NULL;
620     }
621    
622     BOOL CRYPT_set_host_RSA_key(PTInstVar pvar,
623     int bits, unsigned char FAR * exp,
624     unsigned char FAR * mod)
625     {
626     pvar->crypt_state.host_key.RSA_key = make_key(pvar, bits, exp, mod);
627    
628     return pvar->crypt_state.host_key.RSA_key != NULL;
629     }
630    
631     BOOL CRYPT_set_supported_ciphers(PTInstVar pvar, int sender_ciphers,
632     int receiver_ciphers)
633     {
634     int cipher_mask;
635    
636     if (SSHv1(pvar)) {
637     cipher_mask = (1 << SSH_CIPHER_DES)
638     | (1 << SSH_CIPHER_3DES)
639     | (1 << SSH_CIPHER_BLOWFISH);
640    
641     } else { // for SSH2(yutaka)
642     // SSH2���T�|�[�g�����f�[�^���M�p�A���S���Y���i���J�������p�������j
643     cipher_mask = (1 << SSH_CIPHER_3DES_CBC) | (1 << SSH_CIPHER_AES128);
644    
645     }
646    
647     sender_ciphers &= cipher_mask;
648     receiver_ciphers &= cipher_mask;
649     pvar->crypt_state.supported_sender_ciphers = sender_ciphers;
650     pvar->crypt_state.supported_receiver_ciphers = receiver_ciphers;
651    
652     if (sender_ciphers == 0) {
653     notify_fatal_error(pvar,
654     "The server does not support any of the TTSSH encryption algorithms.\n"
655     "A secure connection cannot be made in the TTSSH-to-server direction.\n"
656     "The connection will be closed.");
657     return FALSE;
658     } else if (receiver_ciphers == 0) {
659     notify_fatal_error(pvar,
660     "The server does not support any of the TTSSH encryption algorithms.\n"
661     "A secure connection cannot be made in the server-to-TTSSH direction.\n"
662     "The connection will be closed.");
663     return FALSE;
664     } else {
665     return TRUE;
666     }
667     }
668    
669     int CRYPT_get_decryption_block_size(PTInstVar pvar)
670     {
671     if (SSHv1(pvar)) {
672     return 8;
673     } else {
674     // �p�P�b�g���M���������������A���S���Y�����u���b�N�T�C�Y (2004.11.7 yutaka)
675     // cf. 3DES=8, AES128=16
676     return (pvar->ssh2_keys[MODE_IN].enc.block_size);
677     }
678     }
679    
680     int CRYPT_get_encryption_block_size(PTInstVar pvar)
681     {
682     if (SSHv1(pvar)) {
683     return 8;
684     } else {
685     // �p�P�b�g���M���������������A���S���Y�����u���b�N�T�C�Y (2004.11.7 yutaka)
686     // cf. 3DES=8, AES128=16
687     return (pvar->ssh2_keys[MODE_OUT].enc.block_size);
688     }
689     }
690    
691     int CRYPT_get_receiver_MAC_size(PTInstVar pvar)
692     {
693     struct Mac *mac;
694    
695     if (SSHv1(pvar)) {
696     return 0;
697    
698     } else { // for SSH2(yutaka)
699     mac = &pvar->ssh2_keys[MODE_IN].mac;
700     if (mac == NULL || mac->enabled == 0)
701     return 0;
702    
703     return (pvar->ssh2_keys[MODE_IN].mac.mac_len);
704     }
705    
706     }
707    
708     BOOL CRYPT_verify_receiver_MAC(PTInstVar pvar, uint32 sequence_number,
709     char FAR * data, int len, char FAR * MAC)
710     {
711     return TRUE;
712     }
713    
714     int CRYPT_get_sender_MAC_size(PTInstVar pvar)
715     {
716     struct Mac *mac;
717    
718     if (SSHv2(pvar)) { // for SSH2(yutaka)
719     mac = &pvar->ssh2_keys[MODE_OUT].mac;
720     if (mac == NULL || mac->enabled == 0)
721     return 0;
722    
723     return (mac->mac_len);
724     }
725    
726     return 0;
727     }
728    
729     // for SSH2
730     BOOL CRYPT_build_sender_MAC(PTInstVar pvar, uint32 sequence_number,
731     char FAR * data, int len, char FAR * MAC)
732     {
733     HMAC_CTX c;
734     static u_char m[EVP_MAX_MD_SIZE];
735     u_char b[4];
736     struct Mac *mac;
737    
738     if (SSHv2(pvar)) { // for SSH2(yutaka)
739     mac = &pvar->ssh2_keys[MODE_OUT].mac;
740     if (mac == NULL || mac->enabled == 0)
741     return FALSE;
742    
743     HMAC_Init(&c, mac->key, mac->key_len, mac->md);
744     set_uint32_MSBfirst(b, sequence_number);
745     HMAC_Update(&c, b, sizeof(b));
746     HMAC_Update(&c, data, len);
747     HMAC_Final(&c, m, NULL);
748     HMAC_cleanup(&c);
749    
750     // 20�o�C�g�������R�s�[
751     memcpy(MAC, m, pvar->ssh2_keys[MODE_OUT].mac.mac_len);
752     // memcpy(MAC, m, sizeof(m));
753    
754     return TRUE;
755     }
756    
757     return TRUE;
758    
759     }
760    
761     static int choose_cipher(PTInstVar pvar, int supported)
762     {
763     int i;
764    
765     for (i = 0; pvar->session_settings.CipherOrder[i] != 0; i++) {
766     int cipher = pvar->session_settings.CipherOrder[i] - '0';
767    
768     if (cipher == SSH_CIPHER_NONE) {
769     break;
770     } else if ((supported & (1 << cipher)) != 0) {
771     return cipher;
772     }
773     }
774    
775     return SSH_CIPHER_NONE;
776     }
777    
778     BOOL CRYPT_choose_ciphers(PTInstVar pvar)
779     {
780     if (SSHv1(pvar)) {
781     pvar->crypt_state.sender_cipher = choose_cipher(pvar,
782     pvar->crypt_state.
783     supported_sender_ciphers);
784     pvar->crypt_state.receiver_cipher =
785     choose_cipher(pvar, pvar->crypt_state.supported_receiver_ciphers);
786    
787     } else { // SSH2(yutaka)
788     pvar->crypt_state.sender_cipher = pvar->ctos_cipher;
789     pvar->crypt_state.receiver_cipher =pvar->stoc_cipher;
790    
791     }
792    
793     if (pvar->crypt_state.sender_cipher == SSH_CIPHER_NONE
794     || pvar->crypt_state.receiver_cipher == SSH_CIPHER_NONE) {
795     notify_fatal_error(pvar,
796     "All the encryption algorithms that this program and the server both understand have been disabled.\n"
797     "To communicate with this server, you will have to enable some more ciphers\n"
798     "in the TTSSH Setup dialog box when you run Teraterm again.\n"
799     "This connection will now close.");
800     return FALSE;
801     } else {
802     return TRUE;
803     }
804     }
805    
806     int CRYPT_get_encrypted_session_key_len(PTInstVar pvar)
807     {
808     int server_key_bits =
809     BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
810     int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
811     int server_key_bytes = (server_key_bits + 7) / 8;
812     int host_key_bytes = (host_key_bits + 7) / 8;
813    
814     if (server_key_bits < host_key_bits) {
815     return host_key_bytes;
816     } else {
817     return server_key_bytes;
818     }
819     }
820    
821     int CRYPT_choose_session_key(PTInstVar pvar,
822     unsigned char FAR * encrypted_key_buf)
823     {
824     int server_key_bits =
825     BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
826     int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
827     int server_key_bytes = (server_key_bits + 7) / 8;
828     int host_key_bytes = (host_key_bits + 7) / 8;
829     int encrypted_key_bytes;
830     int bit_delta;
831    
832     if (server_key_bits < host_key_bits) {
833     encrypted_key_bytes = host_key_bytes;
834     bit_delta = host_key_bits - server_key_bits;
835     } else {
836     encrypted_key_bytes = server_key_bytes;
837     bit_delta = server_key_bits - host_key_bits;
838     }
839    
840     if (bit_delta < 128 || server_key_bits < 512 || host_key_bits < 512) {
841     notify_fatal_error(pvar,
842     "Server RSA keys are too weak. A secure connection cannot be established.");
843     return 0;
844     } else {
845     /* following Goldberg's code, I'm using MD5(servkey->n || hostkey->n || cookie)
846     for the session ID, rather than the one specified in the RFC */
847     int session_buf_len = server_key_bytes + host_key_bytes + 8;
848     char FAR *session_buf = (char FAR *) malloc(session_buf_len);
849     char session_id[16];
850     int i;
851    
852     BN_bn2bin(pvar->crypt_state.host_key.RSA_key->n, session_buf);
853     BN_bn2bin(pvar->crypt_state.server_key.RSA_key->n,
854     session_buf + host_key_bytes);
855     memcpy(session_buf + server_key_bytes + host_key_bytes,
856     pvar->crypt_state.server_cookie, 8);
857     MD5(session_buf, session_buf_len, session_id);
858    
859     free(session_buf);
860    
861     RAND_bytes(pvar->crypt_state.sender_cipher_key,
862     SSH_SESSION_KEY_LENGTH);
863     memcpy(pvar->crypt_state.receiver_cipher_key,
864     pvar->crypt_state.sender_cipher_key,
865     SSH_SESSION_KEY_LENGTH);
866    
867     memcpy(encrypted_key_buf + encrypted_key_bytes -
868     SSH_SESSION_KEY_LENGTH, pvar->crypt_state.sender_cipher_key,
869     SSH_SESSION_KEY_LENGTH);
870     for (i = 0; i < sizeof(session_id); i++) {
871     encrypted_key_buf[encrypted_key_bytes -
872     SSH_SESSION_KEY_LENGTH + i]
873     ^= session_id[i];
874     }
875    
876     if (host_key_bits > server_key_bits) {
877     if (RSA_public_encrypt(SSH_SESSION_KEY_LENGTH,
878     encrypted_key_buf +
879     encrypted_key_bytes -
880     SSH_SESSION_KEY_LENGTH,
881     encrypted_key_buf +
882     encrypted_key_bytes - server_key_bytes,
883     pvar->crypt_state.server_key.RSA_key,
884     RSA_PKCS1_PADDING) < 0)
885     return 0;
886    
887     if (RSA_public_encrypt(server_key_bytes,
888     encrypted_key_buf +
889     encrypted_key_bytes - server_key_bytes,
890     encrypted_key_buf,
891     pvar->crypt_state.host_key.RSA_key,
892     RSA_PKCS1_PADDING) < 0)
893     return 0;
894     } else {
895     if (RSA_public_encrypt(SSH_SESSION_KEY_LENGTH,
896     encrypted_key_buf +
897     encrypted_key_bytes -
898     SSH_SESSION_KEY_LENGTH,
899     encrypted_key_buf +
900     encrypted_key_bytes - host_key_bytes,
901     pvar->crypt_state.host_key.RSA_key,
902     RSA_PKCS1_PADDING) < 0)
903     return 0;
904    
905     if (RSA_public_encrypt(host_key_bytes,
906     encrypted_key_buf +
907     encrypted_key_bytes - host_key_bytes,
908     encrypted_key_buf,
909     pvar->crypt_state.server_key.RSA_key,
910     RSA_PKCS1_PADDING) < 0)
911     return 0;
912     }
913     }
914    
915     return 1;
916     }
917    
918     int CRYPT_generate_RSA_challenge_response(PTInstVar pvar,
919     unsigned char FAR * challenge,
920     int challenge_len,
921     unsigned char FAR * response)
922     {
923     int server_key_bits =
924     BN_num_bits(pvar->crypt_state.server_key.RSA_key->n);
925     int host_key_bits = BN_num_bits(pvar->crypt_state.host_key.RSA_key->n);
926     int server_key_bytes = (server_key_bits + 7) / 8;
927     int host_key_bytes = (host_key_bits + 7) / 8;
928     int session_buf_len = server_key_bytes + host_key_bytes + 8;
929     char FAR *session_buf = (char FAR *) malloc(session_buf_len);
930     char decrypted_challenge[48];
931     int decrypted_challenge_len;
932    
933     decrypted_challenge_len =
934     RSA_private_decrypt(challenge_len, challenge, challenge,
935     AUTH_get_cur_cred(pvar)->key_pair->RSA_key,
936     RSA_PKCS1_PADDING);
937     if (decrypted_challenge_len < 0) {
938     free(session_buf);
939     return 0;
940     }
941     if (decrypted_challenge_len >= SSH_RSA_CHALLENGE_LENGTH) {
942     memcpy(decrypted_challenge,
943     challenge + decrypted_challenge_len -
944     SSH_RSA_CHALLENGE_LENGTH, SSH_RSA_CHALLENGE_LENGTH);
945     } else {
946     memset(decrypted_challenge, 0,
947     SSH_RSA_CHALLENGE_LENGTH - decrypted_challenge_len);
948     memcpy(decrypted_challenge + SSH_RSA_CHALLENGE_LENGTH -
949     decrypted_challenge_len, challenge,
950     decrypted_challenge_len);
951     }
952    
953     BN_bn2bin(pvar->crypt_state.host_key.RSA_key->n, session_buf);
954     BN_bn2bin(pvar->crypt_state.server_key.RSA_key->n,
955     session_buf + host_key_bytes);
956     memcpy(session_buf + server_key_bytes + host_key_bytes,
957     pvar->crypt_state.server_cookie, 8);
958     MD5(session_buf, session_buf_len, decrypted_challenge + 32);
959    
960     free(session_buf);
961    
962     MD5(decrypted_challenge, 48, response);
963    
964     return 1;
965     }
966    
967     static void c3DES_init(char FAR * session_key, Cipher3DESState FAR * state)
968     {
969     DES_set_key((const_DES_cblock FAR *) session_key, &state->k1);
970     DES_set_key((const_DES_cblock FAR *) (session_key + 8), &state->k2);
971     DES_set_key((const_DES_cblock FAR *) (session_key + 16), &state->k3);
972     memset(state->ivec1, 0, 8);
973     memset(state->ivec2, 0, 8);
974     memset(state->ivec3, 0, 8);
975     }
976    
977     static void cDES_init(char FAR * session_key, CipherDESState FAR * state)
978     {
979     DES_set_key((const_des_cblock FAR *) session_key, &state->k);
980     memset(state->ivec, 0, 8);
981     }
982    
983     static void cIDEA_init(char FAR * session_key, CipherIDEAState FAR * state)
984     {
985     idea_set_encrypt_key(session_key, &state->k);
986     memset(state->ivec, 0, 8);
987     }
988    
989     static void cBlowfish_init(char FAR * session_key,
990     CipherBlowfishState FAR * state)
991     {
992     BF_set_key(&state->k, 32, session_key);
993     memset(state->ivec, 0, 8);
994     }
995    
996    
997     //
998     // SSH2�p�A���S���Y����������
999     //
1000     // for SSH2(yutaka)
1001     //
1002     void cipher_init_SSH2(
1003     EVP_CIPHER_CTX *evp,
1004     const u_char *key, u_int keylen,
1005     const u_char *iv, u_int ivlen,
1006     int encrypt,
1007     const EVP_CIPHER *(*func)(void)
1008     )
1009     {
1010     EVP_CIPHER *type;
1011     int klen;
1012    
1013     type = (EVP_CIPHER *)func();
1014    
1015     EVP_CIPHER_CTX_init(evp);
1016     if (EVP_CipherInit(evp, type, NULL, (u_char *)iv, (encrypt == CIPHER_ENCRYPT)) == 0) {
1017     // TODO:
1018     }
1019    
1020     klen = EVP_CIPHER_CTX_key_length(evp);
1021     if (klen > 0 && keylen != klen) {
1022     if (EVP_CIPHER_CTX_set_key_length(evp, keylen) == 0) {
1023     // TODO:
1024     }
1025     }
1026     if (EVP_CipherInit(evp, NULL, (u_char *)key, NULL, -1) == 0) {
1027     // TODO:
1028     }
1029     }
1030    
1031    
1032     BOOL CRYPT_start_encryption(PTInstVar pvar, int sender_flag, int receiver_flag)
1033     {
1034     char FAR *encryption_key = pvar->crypt_state.sender_cipher_key;
1035     char FAR *decryption_key = pvar->crypt_state.receiver_cipher_key;
1036     BOOL isOK = TRUE;
1037    
1038     if (sender_flag) {
1039     switch (pvar->crypt_state.sender_cipher) {
1040     // for SSH2(yutaka)
1041     case SSH_CIPHER_3DES_CBC:
1042     {
1043     struct Enc *enc;
1044    
1045     enc = &pvar->ssh2_keys[MODE_OUT].enc;
1046     cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1047     enc->key, 24, enc->iv, 8,
1048     CIPHER_ENCRYPT,
1049     EVP_des_ede3_cbc);
1050    
1051     //debug_print(10, enc->key, 24);
1052     //debug_print(11, enc->iv, 24);
1053    
1054     pvar->crypt_state.encrypt = c3DES_CBC_encrypt;
1055     break;
1056     }
1057    
1058     // for SSH2(yutaka)
1059     case SSH_CIPHER_AES128:
1060     {
1061     struct Enc *enc;
1062    
1063     enc = &pvar->ssh2_keys[MODE_OUT].enc;
1064     cipher_init_SSH2(&pvar->evpcip[MODE_OUT],
1065     enc->key, 16, enc->iv, 16,
1066     CIPHER_ENCRYPT,
1067     EVP_aes_128_cbc);
1068    
1069     //debug_print(10, enc->key, 24);
1070     //debug_print(11, enc->iv, 24);
1071    
1072     pvar->crypt_state.encrypt = cAES128_encrypt;
1073     break;
1074     }
1075    
1076     case SSH_CIPHER_3DES:{
1077     c3DES_init(encryption_key, &pvar->crypt_state.enc.c3DES);
1078     pvar->crypt_state.encrypt = c3DES_encrypt;
1079     break;
1080     }
1081     case SSH_CIPHER_IDEA:{
1082     cIDEA_init(encryption_key, &pvar->crypt_state.enc.cIDEA);
1083     pvar->crypt_state.encrypt = cIDEA_encrypt;
1084     break;
1085     }
1086     case SSH_CIPHER_DES:{
1087     cDES_init(encryption_key, &pvar->crypt_state.enc.cDES);
1088     pvar->crypt_state.encrypt = cDES_encrypt;
1089     break;
1090     }
1091     case SSH_CIPHER_RC4:{
1092     RC4_set_key(&pvar->crypt_state.enc.cRC4.k, 16,
1093     encryption_key + 16);
1094     pvar->crypt_state.encrypt = cRC4_encrypt;
1095     break;
1096     }
1097     case SSH_CIPHER_BLOWFISH:{
1098     cBlowfish_init(encryption_key,
1099     &pvar->crypt_state.enc.cBlowfish);
1100     pvar->crypt_state.encrypt = cBlowfish_encrypt;
1101     break;
1102     }
1103     default:
1104     isOK = FALSE;
1105     }
1106     }
1107    
1108    
1109     if (receiver_flag) {
1110     switch (pvar->crypt_state.receiver_cipher) {
1111     // for SSH2(yutaka)
1112     case SSH_CIPHER_3DES_CBC:
1113     {
1114     struct Enc *enc;
1115    
1116     enc = &pvar->ssh2_keys[MODE_IN].enc;
1117     cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1118     enc->key, 24, enc->iv, 8,
1119     CIPHER_DECRYPT,
1120     EVP_des_ede3_cbc);
1121    
1122     //debug_print(12, enc->key, 24);
1123     //debug_print(13, enc->iv, 24);
1124    
1125     pvar->crypt_state.decrypt = c3DES_CBC_decrypt;
1126     break;
1127     }
1128    
1129     // for SSH2(yutaka)
1130     case SSH_CIPHER_AES128:
1131     {
1132     struct Enc *enc;
1133    
1134     enc = &pvar->ssh2_keys[MODE_IN].enc;
1135     cipher_init_SSH2(&pvar->evpcip[MODE_IN],
1136     enc->key, 16, enc->iv, 16,
1137     CIPHER_DECRYPT,
1138     EVP_aes_128_cbc);
1139    
1140     //debug_print(12, enc->key, 24);
1141     //debug_print(13, enc->iv, 24);
1142    
1143     pvar->crypt_state.decrypt = cAES128_decrypt;
1144     break;
1145     }
1146    
1147     case SSH_CIPHER_3DES:{
1148     c3DES_init(decryption_key, &pvar->crypt_state.dec.c3DES);
1149     pvar->crypt_state.decrypt = c3DES_decrypt;
1150     break;
1151     }
1152     case SSH_CIPHER_IDEA:{
1153     cIDEA_init(decryption_key, &pvar->crypt_state.dec.cIDEA);
1154     pvar->crypt_state.decrypt = cIDEA_decrypt;
1155     break;
1156     }
1157     case SSH_CIPHER_DES:{
1158     cDES_init(decryption_key, &pvar->crypt_state.dec.cDES);
1159     pvar->crypt_state.decrypt = cDES_decrypt;
1160     break;
1161     }
1162     case SSH_CIPHER_RC4:{
1163     RC4_set_key(&pvar->crypt_state.dec.cRC4.k, 16, decryption_key);
1164     pvar->crypt_state.decrypt = cRC4_decrypt;
1165     break;
1166     }
1167     case SSH_CIPHER_BLOWFISH:{
1168     cBlowfish_init(decryption_key,
1169     &pvar->crypt_state.dec.cBlowfish);
1170     pvar->crypt_state.decrypt = cBlowfish_decrypt;
1171     break;
1172     }
1173     default:
1174     isOK = FALSE;
1175     }
1176     }
1177    
1178    
1179     if (!isOK) {
1180     notify_fatal_error(pvar, "No cipher selected!"); /* should never get here! */
1181     return FALSE;
1182     } else {
1183     memset(encryption_key, 0, CRYPT_KEY_LENGTH);
1184     memset(decryption_key, 0, CRYPT_KEY_LENGTH);
1185     return TRUE;
1186     }
1187     }
1188    
1189     void CRYPT_init(PTInstVar pvar)
1190     {
1191     pvar->crypt_state.encrypt = no_encrypt;
1192     pvar->crypt_state.decrypt = no_encrypt;
1193     pvar->crypt_state.sender_cipher = SSH_CIPHER_NONE;
1194     pvar->crypt_state.receiver_cipher = SSH_CIPHER_NONE;
1195     pvar->crypt_state.server_key.RSA_key = NULL;
1196     pvar->crypt_state.host_key.RSA_key = NULL;
1197    
1198     pvar->crypt_state.detect_attack_statics.h = NULL;
1199     pvar->crypt_state.detect_attack_statics.n =
1200     HASH_MINSIZE / HASH_ENTRYSIZE;
1201     }
1202    
1203     static char FAR *get_cipher_name(int cipher)
1204     {
1205     switch (cipher) {
1206     case SSH_CIPHER_NONE:
1207     return "None";
1208     case SSH_CIPHER_3DES:
1209     return "3DES (168 key bits)";
1210     case SSH_CIPHER_DES:
1211     return "DES (56 key bits)";
1212     case SSH_CIPHER_IDEA:
1213     return "IDEA (128 key bits)";
1214     case SSH_CIPHER_RC4:
1215     return "RC4 (128 key bits)";
1216     case SSH_CIPHER_BLOWFISH:
1217     return "Blowfish (256 key bits)";
1218    
1219     // SSH2
1220     case SSH_CIPHER_3DES_CBC:
1221     return "3DES-CBC";
1222     case SSH_CIPHER_AES128:
1223     return "AES128";
1224    
1225     default:
1226     return "Unknown";
1227     }
1228     }
1229    
1230     void CRYPT_get_cipher_info(PTInstVar pvar, char FAR * dest, int len)
1231     {
1232     _snprintf(dest, len, "%s to server, %s from server",
1233     get_cipher_name(pvar->crypt_state.sender_cipher),
1234     get_cipher_name(pvar->crypt_state.receiver_cipher));
1235     dest[len - 1] = 0;
1236     }
1237    
1238     void CRYPT_get_server_key_info(PTInstVar pvar, char FAR * dest, int len)
1239     {
1240     if (SSHv1(pvar)) {
1241     if (pvar->crypt_state.server_key.RSA_key == NULL
1242     || pvar->crypt_state.host_key.RSA_key == NULL) {
1243     strncpy(dest, "None", len);
1244     } else {
1245     _snprintf(dest, len, "%d-bit server key, %d-bit host key",
1246     BN_num_bits(pvar->crypt_state.server_key.RSA_key->n),
1247     BN_num_bits(pvar->crypt_state.host_key.RSA_key->n));
1248     }
1249    
1250     } else { // SSH2
1251     _snprintf(dest, len, "%d-bit server key, %d-bit host key",
1252     pvar->server_key_bits,
1253     pvar->client_key_bits);
1254    
1255     }
1256    
1257     dest[len - 1] = 0;
1258     }
1259    
1260     static void destroy_public_key(CRYPTPublicKey FAR * key)
1261     {
1262     if (key->RSA_key != NULL) {
1263     RSA_free(key->RSA_key);
1264     key->RSA_key = NULL;
1265     }
1266     }
1267    
1268     void CRYPT_free_public_key(CRYPTPublicKey FAR * key)
1269     {
1270     destroy_public_key(key);
1271     free(key);
1272     }
1273    
1274     void CRYPT_end(PTInstVar pvar)
1275     {
1276     destroy_public_key(&pvar->crypt_state.host_key);
1277     destroy_public_key(&pvar->crypt_state.server_key);
1278    
1279     if (pvar->crypt_state.detect_attack_statics.h != NULL) {
1280     memset(pvar->crypt_state.detect_attack_statics.h, 0,
1281     pvar->crypt_state.detect_attack_statics.n * HASH_ENTRYSIZE);
1282     free(pvar->crypt_state.detect_attack_statics.h);
1283     }
1284    
1285     memset(pvar->crypt_state.sender_cipher_key, 0,
1286     sizeof(pvar->crypt_state.sender_cipher_key));
1287     memset(pvar->crypt_state.receiver_cipher_key, 0,
1288     sizeof(pvar->crypt_state.receiver_cipher_key));
1289     memset(pvar->crypt_state.server_cookie, 0,
1290     sizeof(pvar->crypt_state.server_cookie));
1291     memset(pvar->crypt_state.client_cookie, 0,
1292     sizeof(pvar->crypt_state.client_cookie));
1293     memset(&pvar->crypt_state.enc, 0, sizeof(pvar->crypt_state.enc));
1294     memset(&pvar->crypt_state.dec, 0, sizeof(pvar->crypt_state.dec));
1295     }
1296    
1297     int CRYPT_passphrase_decrypt(int cipher, char FAR * passphrase,
1298     char FAR * buf, int bytes)
1299     {
1300     unsigned char passphrase_key[16];
1301    
1302     MD5(passphrase, strlen(passphrase), passphrase_key);
1303    
1304     switch (cipher) {
1305     case SSH_CIPHER_3DES:{
1306     Cipher3DESState state;
1307    
1308     DES_set_key((const_DES_cblock FAR *) passphrase_key,
1309     &state.k1);
1310     DES_set_key((const_DES_cblock FAR *) (passphrase_key + 8),
1311     &state.k2);
1312     DES_set_key((const_DES_cblock FAR *) passphrase_key,
1313     &state.k3);
1314     memset(state.ivec1, 0, 8);
1315     memset(state.ivec2, 0, 8);
1316     memset(state.ivec3, 0, 8);
1317     DES_ncbc_encrypt(buf, buf, bytes,
1318     &state.k3, &state.ivec3, DES_DECRYPT);
1319     DES_ncbc_encrypt(buf, buf, bytes,
1320     &state.k2, &state.ivec2, DES_ENCRYPT);
1321     DES_ncbc_encrypt(buf, buf, bytes,
1322     &state.k1, &state.ivec1, DES_DECRYPT);
1323     break;
1324     }
1325    
1326     case SSH_CIPHER_IDEA:{
1327     CipherIDEAState state;
1328     int num = 0;
1329    
1330     cIDEA_init(passphrase_key, &state);
1331     idea_cfb64_encrypt(buf, buf, bytes, &state.k, state.ivec,
1332     &num, IDEA_DECRYPT);
1333     break;
1334     }
1335    
1336     case SSH_CIPHER_DES:{
1337     CipherDESState state;
1338    
1339     cDES_init(passphrase_key, &state);
1340     DES_ncbc_encrypt(buf, buf, bytes,
1341     &state.k, &state.ivec, DES_DECRYPT);
1342     break;
1343     }
1344    
1345     case SSH_CIPHER_RC4:{
1346     CipherRC4State state;
1347     int num = 0;
1348    
1349     RC4_set_key(&state.k, 16, passphrase_key);
1350     RC4(&state.k, bytes, buf, buf);
1351     break;
1352     }
1353    
1354     case SSH_CIPHER_BLOWFISH:{
1355     CipherBlowfishState state;
1356    
1357     BF_set_key(&state.k, 16, passphrase_key);
1358     memset(state.ivec, 0, 8);
1359     flip_endianness(buf, bytes);
1360     BF_cbc_encrypt(buf, buf, bytes, &state.k, state.ivec,
1361     BF_DECRYPT);
1362     flip_endianness(buf, bytes);
1363     break;
1364     }
1365    
1366     case SSH_CIPHER_NONE:
1367     break;
1368    
1369     default:
1370     memset(passphrase_key, 0, sizeof(passphrase_key));
1371     return 0;
1372     }
1373    
1374     memset(passphrase_key, 0, sizeof(passphrase_key));
1375     return 1;
1376     }
1377    
1378     void CRYPT_free_key_pair(CRYPTKeyPair FAR * key_pair)
1379     {
1380     RSA_free(key_pair->RSA_key);
1381     free(key_pair);
1382     }

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