Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6841 - (hide annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 9 months ago) by doda
Original Path: trunk/ttssh2/ttxssh/ssh.h
File MIME type: text/x-chdr
File size: 30456 byte(s)
TeraTerm Project としてのライセンス表記を追加

・Tera Term 本体分を横 80 桁に収まるように改行位置を調整
・ttssh 関連の分を追加
1 maya 3227 /*
2 doda 6841 * Copyright (c) 1998-2001, Robert O'Callahan
3     * (C) 2004-2017 TeraTerm Project
4     * All rights reserved.
5     *
6     * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9     *
10     * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17     *
18     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28     */
29 maya 3227
30     /*
31     This code is copyright (C) 1998-1999 Robert O'Callahan.
32     See LICENSE.TXT for the license.
33     */
34    
35     #ifndef __SSH_H
36     #define __SSH_H
37    
38     #include "zlib.h"
39     #include <openssl/evp.h>
40    
41     #include "buffer.h"
42 doda 4433 #include "config.h"
43 yutakapon 4926 #include <sys/types.h>
44     #include <sys/stat.h>
45 maya 3227
46     #define DEBUG_PRINT_TO_FILE(base, msg, len) { \
47     static int count = 0; \
48     debug_print(count + base, msg, len); \
49     count++; \
50     }
51    
52     // from OpenSSH
53     extern const EVP_CIPHER *evp_aes_128_ctr(void);
54 doda 3850 extern const EVP_CIPHER *evp_des3_ctr(void);
55     extern const EVP_CIPHER *evp_bf_ctr(void);
56     extern const EVP_CIPHER *evp_cast5_ctr(void);
57 doda 4433 extern const EVP_CIPHER *evp_camellia_128_ctr(void);
58 maya 3227
59     /* Some of this code has been adapted from Ian Goldberg's Pilot SSH */
60    
61     typedef enum {
62     SSH_MSG_NONE, SSH_MSG_DISCONNECT, SSH_SMSG_PUBLIC_KEY, //2
63     SSH_CMSG_SESSION_KEY, SSH_CMSG_USER, SSH_CMSG_AUTH_RHOSTS, // 5
64     SSH_CMSG_AUTH_RSA, SSH_SMSG_AUTH_RSA_CHALLENGE,
65     SSH_CMSG_AUTH_RSA_RESPONSE, SSH_CMSG_AUTH_PASSWORD,
66     SSH_CMSG_REQUEST_PTY, // 10
67     SSH_CMSG_WINDOW_SIZE, SSH_CMSG_EXEC_SHELL,
68     SSH_CMSG_EXEC_CMD, SSH_SMSG_SUCCESS, SSH_SMSG_FAILURE,
69     SSH_CMSG_STDIN_DATA, SSH_SMSG_STDOUT_DATA, SSH_SMSG_STDERR_DATA,
70     SSH_CMSG_EOF, SSH_SMSG_EXITSTATUS,
71     SSH_MSG_CHANNEL_OPEN_CONFIRMATION, SSH_MSG_CHANNEL_OPEN_FAILURE,
72     SSH_MSG_CHANNEL_DATA, SSH_MSG_CHANNEL_INPUT_EOF,
73     SSH_MSG_CHANNEL_OUTPUT_CLOSED, SSH_MSG_OBSOLETED0,
74     SSH_SMSG_X11_OPEN, SSH_CMSG_PORT_FORWARD_REQUEST, SSH_MSG_PORT_OPEN,
75     SSH_CMSG_AGENT_REQUEST_FORWARDING, SSH_SMSG_AGENT_OPEN,
76     SSH_MSG_IGNORE, SSH_CMSG_EXIT_CONFIRMATION,
77     SSH_CMSG_X11_REQUEST_FORWARDING, SSH_CMSG_AUTH_RHOSTS_RSA,
78     SSH_MSG_DEBUG, SSH_CMSG_REQUEST_COMPRESSION,
79     SSH_CMSG_MAX_PACKET_SIZE, SSH_CMSG_AUTH_TIS,
80     SSH_SMSG_AUTH_TIS_CHALLENGE, SSH_CMSG_AUTH_TIS_RESPONSE,
81     SSH_CMSG_AUTH_KERBEROS, SSH_SMSG_AUTH_KERBEROS_RESPONSE
82     } SSHMessage;
83    
84     typedef enum {
85 doda 6716 // SSH1
86 maya 3227 SSH_CIPHER_NONE, SSH_CIPHER_IDEA, SSH_CIPHER_DES, SSH_CIPHER_3DES,
87     SSH_CIPHER_TSS, SSH_CIPHER_RC4, SSH_CIPHER_BLOWFISH,
88 doda 6716 // SSH2
89 maya 3227 SSH2_CIPHER_3DES_CBC, SSH2_CIPHER_AES128_CBC,
90     SSH2_CIPHER_AES192_CBC, SSH2_CIPHER_AES256_CBC,
91     SSH2_CIPHER_BLOWFISH_CBC, SSH2_CIPHER_AES128_CTR,
92     SSH2_CIPHER_AES192_CTR, SSH2_CIPHER_AES256_CTR,
93     SSH2_CIPHER_ARCFOUR, SSH2_CIPHER_ARCFOUR128, SSH2_CIPHER_ARCFOUR256,
94     SSH2_CIPHER_CAST128_CBC,
95 doda 3850 SSH2_CIPHER_3DES_CTR, SSH2_CIPHER_BLOWFISH_CTR, SSH2_CIPHER_CAST128_CTR,
96 doda 4433 SSH2_CIPHER_CAMELLIA128_CBC, SSH2_CIPHER_CAMELLIA192_CBC, SSH2_CIPHER_CAMELLIA256_CBC,
97     SSH2_CIPHER_CAMELLIA128_CTR, SSH2_CIPHER_CAMELLIA192_CTR, SSH2_CIPHER_CAMELLIA256_CTR,
98     SSH_CIPHER_MAX = SSH2_CIPHER_CAMELLIA256_CTR,
99 maya 3227 } SSHCipher;
100    
101     typedef enum {
102     SSH_AUTH_NONE, SSH_AUTH_RHOSTS, SSH_AUTH_RSA, SSH_AUTH_PASSWORD,
103     SSH_AUTH_RHOSTS_RSA, SSH_AUTH_TIS, SSH_AUTH_KERBEROS,
104     SSH_AUTH_PAGEANT = 16,
105 maya 4378 SSH_AUTH_MAX = SSH_AUTH_PAGEANT,
106 maya 3227 } SSHAuthMethod;
107    
108     typedef enum {
109     SSH_GENERIC_AUTHENTICATION, SSH_TIS_AUTHENTICATION
110     } SSHAuthMode;
111    
112     #define SSH_PROTOFLAG_SCREEN_NUMBER 1
113     #define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 2
114    
115     enum channel_type {
116 doda 6717 TYPE_SHELL, TYPE_PORTFWD, TYPE_SCP, TYPE_SFTP, TYPE_AGENT, TYPE_SUBSYSTEM_GEN,
117 maya 3227 };
118    
119     // for SSH1
120     #define SSH_MAX_SEND_PACKET_SIZE 250000
121    
122     // for SSH2
123     /* default window/packet sizes for tcp/x11-fwd-channel */
124     // changed CHAN_SES_WINDOW_DEFAULT from 32KB to 128KB. (2007.10.29 maya)
125     #define CHAN_SES_PACKET_DEFAULT (32*1024)
126     #define CHAN_SES_WINDOW_DEFAULT (4*CHAN_SES_PACKET_DEFAULT)
127     #define CHAN_TCP_PACKET_DEFAULT (32*1024)
128     #define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT)
129     #if 0 // unused
130     #define CHAN_X11_PACKET_DEFAULT (16*1024)
131     #define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT)
132     #endif
133    
134    
135     /* SSH2 constants */
136    
137     /* SSH2 messages */
138     #define SSH2_MSG_DISCONNECT 1
139     #define SSH2_MSG_IGNORE 2
140     #define SSH2_MSG_UNIMPLEMENTED 3
141     #define SSH2_MSG_DEBUG 4
142     #define SSH2_MSG_SERVICE_REQUEST 5
143     #define SSH2_MSG_SERVICE_ACCEPT 6
144    
145     #define SSH2_MSG_KEXINIT 20
146     #define SSH2_MSG_NEWKEYS 21
147    
148     #define SSH2_MSG_KEXDH_INIT 30
149     #define SSH2_MSG_KEXDH_REPLY 31
150    
151     #define SSH2_MSG_KEX_DH_GEX_GROUP 31
152     #define SSH2_MSG_KEX_DH_GEX_INIT 32
153     #define SSH2_MSG_KEX_DH_GEX_REPLY 33
154     #define SSH2_MSG_KEX_DH_GEX_REQUEST 34
155    
156 maya 4314 #define SSH2_MSG_KEX_ECDH_INIT 30
157     #define SSH2_MSG_KEX_ECDH_REPLY 31
158    
159 maya 3227 #define SSH2_MSG_USERAUTH_REQUEST 50
160     #define SSH2_MSG_USERAUTH_FAILURE 51
161     #define SSH2_MSG_USERAUTH_SUCCESS 52
162     #define SSH2_MSG_USERAUTH_BANNER 53
163    
164     #define SSH2_MSG_USERAUTH_PK_OK 60
165     #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60
166     #define SSH2_MSG_USERAUTH_INFO_REQUEST 60
167     #define SSH2_MSG_USERAUTH_INFO_RESPONSE 61
168    
169     #define SSH2_MSG_GLOBAL_REQUEST 80
170     #define SSH2_MSG_REQUEST_SUCCESS 81
171     #define SSH2_MSG_REQUEST_FAILURE 82
172     #define SSH2_MSG_CHANNEL_OPEN 90
173     #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91
174     #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92
175     #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93
176     #define SSH2_MSG_CHANNEL_DATA 94
177     #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95
178     #define SSH2_MSG_CHANNEL_EOF 96
179     #define SSH2_MSG_CHANNEL_CLOSE 97
180     #define SSH2_MSG_CHANNEL_REQUEST 98
181     #define SSH2_MSG_CHANNEL_SUCCESS 99
182     #define SSH2_MSG_CHANNEL_FAILURE 100
183    
184     /* SSH2 miscellaneous constants */
185     #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1
186     #define SSH2_DISCONNECT_PROTOCOL_ERROR 2
187     #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3
188     #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4
189     #define SSH2_DISCONNECT_MAC_ERROR 5
190     #define SSH2_DISCONNECT_COMPRESSION_ERROR 6
191     #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7
192     #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8
193     #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9
194     #define SSH2_DISCONNECT_CONNECTION_LOST 10
195     #define SSH2_DISCONNECT_BY_APPLICATION 11
196 maya 5669 #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12
197     #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13
198     #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14
199     #define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15
200 maya 3227
201     #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1
202     #define SSH2_OPEN_CONNECT_FAILED 2
203     #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3
204     #define SSH2_OPEN_RESOURCE_SHORTAGE 4
205    
206 doda 5587 // Terminal Modes
207     #define SSH2_TTY_OP_END 0
208     #define SSH2_TTY_KEY_VINTR 1
209     #define SSH2_TTY_KEY_VQUIT 2
210     #define SSH2_TTY_KEY_VERASE 3
211     #define SSH2_TTY_KEY_VKILL 4
212     #define SSH2_TTY_KEY_VEOF 5
213     #define SSH2_TTY_KEY_VEOL 6
214     #define SSH2_TTY_KEY_VEOL2 7
215     #define SSH2_TTY_KEY_VSTART 8
216     #define SSH2_TTY_KEY_VSTOP 9
217     #define SSH2_TTY_KEY_VSUSP 10
218     #define SSH2_TTY_KEY_VDSUSP 11
219     #define SSH2_TTY_KEY_VREPRINT 12
220     #define SSH2_TTY_KEY_VWERASE 13
221     #define SSH2_TTY_KEY_VLNEXT 14
222     #define SSH2_TTY_KEY_VFLUSH 15
223     #define SSH2_TTY_KEY_VSWTCH 16
224     #define SSH2_TTY_KEY_VSTATUS 17
225     #define SSH2_TTY_KEY_VDISCARD 18
226     #define SSH2_TTY_OP_IGNPAR 30
227     #define SSH2_TTY_OP_PARMRK 31
228     #define SSH2_TTY_OP_INPCK 32
229     #define SSH2_TTY_OP_ISTRIP 33
230     #define SSH2_TTY_OP_INLCR 34
231     #define SSH2_TTY_OP_IGNCR 35
232     #define SSH2_TTY_OP_ICRNL 36
233     #define SSH2_TTY_OP_IUCLC 37
234     #define SSH2_TTY_OP_IXON 38
235     #define SSH2_TTY_OP_IXANY 39
236     #define SSH2_TTY_OP_IXOFF 40
237     #define SSH2_TTY_OP_IMAXBEL 41
238     #define SSH2_TTY_OP_ISIG 50
239     #define SSH2_TTY_OP_ICANON 51
240     #define SSH2_TTY_OP_XCASE 52
241     #define SSH2_TTY_OP_ECHO 53
242     #define SSH2_TTY_OP_ECHOE 54
243     #define SSH2_TTY_OP_ECHOK 55
244     #define SSH2_TTY_OP_ECHONL 56
245     #define SSH2_TTY_OP_NOFLSH 57
246     #define SSH2_TTY_OP_TOSTOP 58
247     #define SSH2_TTY_OP_IEXTEN 59
248     #define SSH2_TTY_OP_ECHOCTL 60
249     #define SSH2_TTY_OP_ECHOKE 61
250     #define SSH2_TTY_OP_PENDIN 62
251     #define SSH2_TTY_OP_OPOST 70
252     #define SSH2_TTY_OP_OLCUC 71
253     #define SSH2_TTY_OP_ONLCR 72
254     #define SSH2_TTY_OP_OCRNL 73
255     #define SSH2_TTY_OP_ONOCR 74
256     #define SSH2_TTY_OP_ONLRET 75
257     #define SSH2_TTY_OP_CS7 90
258     #define SSH2_TTY_OP_CS8 91
259     #define SSH2_TTY_OP_PARENB 92
260     #define SSH2_TTY_OP_PARODD 93
261     #define SSH2_TTY_OP_ISPEED 128
262     #define SSH2_TTY_OP_OSPEED 129
263 maya 3227
264 doda 5587
265 maya 4378 // �N���C�A���g�����T�[�o������������
266 maya 3227 enum kex_init_proposals {
267     PROPOSAL_KEX_ALGS,
268     PROPOSAL_SERVER_HOST_KEY_ALGS,
269     PROPOSAL_ENC_ALGS_CTOS,
270     PROPOSAL_ENC_ALGS_STOC,
271     PROPOSAL_MAC_ALGS_CTOS,
272     PROPOSAL_MAC_ALGS_STOC,
273     PROPOSAL_COMP_ALGS_CTOS,
274     PROPOSAL_COMP_ALGS_STOC,
275     PROPOSAL_LANG_CTOS,
276     PROPOSAL_LANG_STOC,
277     PROPOSAL_MAX
278     };
279    
280 maya 4378 #define KEX_DEFAULT_KEX ""
281     #define KEX_DEFAULT_PK_ALG ""
282     #define KEX_DEFAULT_ENCRYPT ""
283     #define KEX_DEFAULT_MAC ""
284     #define KEX_DEFAULT_COMP ""
285     #define KEX_DEFAULT_LANG ""
286 maya 3227
287     static char *myproposal[PROPOSAL_MAX] = {
288     KEX_DEFAULT_KEX,
289     KEX_DEFAULT_PK_ALG,
290     KEX_DEFAULT_ENCRYPT,
291     KEX_DEFAULT_ENCRYPT,
292     KEX_DEFAULT_MAC,
293     KEX_DEFAULT_MAC,
294     KEX_DEFAULT_COMP,
295     KEX_DEFAULT_COMP,
296     KEX_DEFAULT_LANG,
297     KEX_DEFAULT_LANG,
298     };
299    
300    
301 maya 4378 typedef enum {
302     KEY_NONE,
303     KEY_RSA1,
304     KEY_RSA,
305     KEY_DSA,
306     KEY_ECDSA256,
307     KEY_ECDSA384,
308     KEY_ECDSA521,
309 yutakapon 5545 KEY_ED25519,
310 maya 4378 KEY_UNSPEC,
311     KEY_MAX = KEY_UNSPEC,
312     } ssh_keytype;
313 yutakapon 5545 #define isFixedLengthKey(type) ((type) >= KEY_DSA && (type) <= KEY_ED25519)
314 maya 4378
315     typedef struct ssh2_host_key {
316     ssh_keytype type;
317     char *name;
318     } ssh2_host_key_t;
319    
320     static ssh2_host_key_t ssh2_host_key[] = {
321 maya 4592 {KEY_RSA1, "ssh-rsa1"}, // for SSH1 only
322     {KEY_RSA, "ssh-rsa"}, // RFC4253
323     {KEY_DSA, "ssh-dss"}, // RFC4253
324     {KEY_ECDSA256, "ecdsa-sha2-nistp256"}, // RFC5656
325     {KEY_ECDSA384, "ecdsa-sha2-nistp384"}, // RFC5656
326     {KEY_ECDSA521, "ecdsa-sha2-nistp521"}, // RFC5656
327 maya 6270 {KEY_ED25519, "ssh-ed25519"}, // draft-bjh21-ssh-ed25519-02
328 maya 4378 {KEY_UNSPEC, "ssh-unknown"},
329     {KEY_NONE, NULL},
330     };
331    
332     /* Minimum modulus size (n) for RSA keys. */
333     #define SSH_RSA_MINIMUM_MODULUS_SIZE 768
334    
335     #define SSH_KEYGEN_DEFAULT_BITS 2048
336     #define SSH_RSA_MINIMUM_KEY_SIZE 768
337     #define SSH_DSA_MINIMUM_KEY_SIZE 1024
338    
339 maya 5765 #define SSH_KEYGEN_MINIMUM_ROUNDS 1
340     #define SSH_KEYGEN_MAXIMUM_ROUNDS INT_MAX
341 maya 4378
342 maya 5765
343 maya 3227 typedef struct ssh2_cipher {
344     SSHCipher cipher;
345     char *name;
346     int block_size;
347     int key_len;
348     int discard_len;
349     const EVP_CIPHER *(*func)(void);
350     } ssh2_cipher_t;
351    
352     static ssh2_cipher_t ssh2_ciphers[] = {
353 maya 4592 {SSH2_CIPHER_3DES_CBC, "3des-cbc", 8, 24, 0, EVP_des_ede3_cbc}, // RFC4253
354     {SSH2_CIPHER_AES128_CBC, "aes128-cbc", 16, 16, 0, EVP_aes_128_cbc}, // RFC4253
355     {SSH2_CIPHER_AES192_CBC, "aes192-cbc", 16, 24, 0, EVP_aes_192_cbc}, // RFC4253
356     {SSH2_CIPHER_AES256_CBC, "aes256-cbc", 16, 32, 0, EVP_aes_256_cbc}, // RFC4253
357     {SSH2_CIPHER_BLOWFISH_CBC, "blowfish-cbc", 8, 16, 0, EVP_bf_cbc}, // RFC4253
358     {SSH2_CIPHER_AES128_CTR, "aes128-ctr", 16, 16, 0, evp_aes_128_ctr}, // RFC4344
359     {SSH2_CIPHER_AES192_CTR, "aes192-ctr", 16, 24, 0, evp_aes_128_ctr}, // RFC4344
360     {SSH2_CIPHER_AES256_CTR, "aes256-ctr", 16, 32, 0, evp_aes_128_ctr}, // RFC4344
361     {SSH2_CIPHER_ARCFOUR, "arcfour", 8, 16, 0, EVP_rc4}, // RFC4253
362     {SSH2_CIPHER_ARCFOUR128, "arcfour128", 8, 16, 1536, EVP_rc4}, // RFC4345
363     {SSH2_CIPHER_ARCFOUR256, "arcfour256", 8, 32, 1536, EVP_rc4}, // RFC4345
364     {SSH2_CIPHER_CAST128_CBC, "cast128-cbc", 8, 16, 0, EVP_cast5_cbc}, // RFC4253
365     {SSH2_CIPHER_3DES_CTR, "3des-ctr", 8, 24, 0, evp_des3_ctr}, // RFC4344
366 doda 6371 {SSH2_CIPHER_BLOWFISH_CTR, "blowfish-ctr", 8, 32, 0, evp_bf_ctr}, // RFC4344
367 maya 4592 {SSH2_CIPHER_CAST128_CTR, "cast128-ctr", 8, 16, 0, evp_cast5_ctr}, // RFC4344
368     {SSH2_CIPHER_CAMELLIA128_CBC, "camellia128-cbc", 16, 16, 0, EVP_camellia_128_cbc}, // draft-kanno-secsh-camellia-02
369     {SSH2_CIPHER_CAMELLIA192_CBC, "camellia192-cbc", 16, 24, 0, EVP_camellia_192_cbc}, // draft-kanno-secsh-camellia-02
370     {SSH2_CIPHER_CAMELLIA256_CBC, "camellia256-cbc", 16, 32, 0, EVP_camellia_256_cbc}, // draft-kanno-secsh-camellia-02
371     {SSH2_CIPHER_CAMELLIA128_CTR, "camellia128-ctr", 16, 16, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
372     {SSH2_CIPHER_CAMELLIA192_CTR, "camellia192-ctr", 16, 24, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
373     {SSH2_CIPHER_CAMELLIA256_CTR, "camellia256-ctr", 16, 32, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
374 doda 4433 #ifdef WITH_CAMELLIA_PRIVATE
375     {SSH2_CIPHER_CAMELLIA128_CBC, "camellia128-cbc@openssh.org", 16, 16, 0, EVP_camellia_128_cbc},
376     {SSH2_CIPHER_CAMELLIA192_CBC, "camellia192-cbc@openssh.org", 16, 24, 0, EVP_camellia_192_cbc},
377     {SSH2_CIPHER_CAMELLIA256_CBC, "camellia256-cbc@openssh.org", 16, 32, 0, EVP_camellia_256_cbc},
378     {SSH2_CIPHER_CAMELLIA128_CTR, "camellia128-ctr@openssh.org", 16, 16, 0, evp_camellia_128_ctr},
379     {SSH2_CIPHER_CAMELLIA192_CTR, "camellia192-ctr@openssh.org", 16, 24, 0, evp_camellia_128_ctr},
380     {SSH2_CIPHER_CAMELLIA256_CTR, "camellia256-ctr@openssh.org", 16, 32, 0, evp_camellia_128_ctr},
381     #endif // WITH_CAMELLIA_PRIVATE
382 maya 4301 {SSH_CIPHER_NONE, NULL, 0, 0, 0, NULL},
383 maya 3227 };
384    
385    
386 maya 4378 typedef enum {
387 yutakapon 4367 KEX_DH_NONE, /* disabled line */
388 maya 4301 KEX_DH_GRP1_SHA1,
389     KEX_DH_GRP14_SHA1,
390     KEX_DH_GEX_SHA1,
391     KEX_DH_GEX_SHA256,
392 maya 4314 KEX_ECDH_SHA2_256,
393     KEX_ECDH_SHA2_384,
394     KEX_ECDH_SHA2_521,
395 doda 6263 KEX_DH_GRP14_SHA256,
396 doda 6310 KEX_DH_GRP16_SHA512,
397     KEX_DH_GRP18_SHA512,
398 maya 4301 KEX_DH_UNKNOWN,
399 yutakapon 4367 KEX_DH_MAX = KEX_DH_UNKNOWN,
400 maya 4378 } kex_algorithm;
401 maya 4301
402     typedef struct ssh2_kex_algorithm {
403 maya 4378 kex_algorithm kextype;
404 maya 4301 char *name;
405     const EVP_MD *(*evp_md)(void);
406     } ssh2_kex_algorithm_t;
407    
408     static ssh2_kex_algorithm_t ssh2_kex_algorithms[] = {
409 maya 4592 {KEX_DH_GRP1_SHA1, "diffie-hellman-group1-sha1", EVP_sha1}, // RFC4253
410     {KEX_DH_GRP14_SHA1, "diffie-hellman-group14-sha1", EVP_sha1}, // RFC4253
411     {KEX_DH_GEX_SHA1, "diffie-hellman-group-exchange-sha1", EVP_sha1}, // RFC4419
412     {KEX_DH_GEX_SHA256, "diffie-hellman-group-exchange-sha256", EVP_sha256}, // RFC4419
413     {KEX_ECDH_SHA2_256, "ecdh-sha2-nistp256", EVP_sha256}, // RFC5656
414     {KEX_ECDH_SHA2_384, "ecdh-sha2-nistp384", EVP_sha384}, // RFC5656
415     {KEX_ECDH_SHA2_521, "ecdh-sha2-nistp521", EVP_sha512}, // RFC5656
416 doda 6310 {KEX_DH_GRP14_SHA256, "diffie-hellman-group14-sha256", EVP_sha256}, // draft-baushke-ssh-dh-group-sha2-04
417     {KEX_DH_GRP16_SHA512, "diffie-hellman-group16-sha512", EVP_sha512}, // draft-baushke-ssh-dh-group-sha2-04
418     {KEX_DH_GRP18_SHA512, "diffie-hellman-group18-sha512", EVP_sha512}, // draft-baushke-ssh-dh-group-sha2-04
419 maya 4378 {KEX_DH_NONE , NULL, NULL},
420 maya 4301 };
421    
422    
423 maya 4378 typedef enum {
424     HMAC_NONE, /* disabled line */
425 maya 4301 HMAC_SHA1,
426     HMAC_MD5,
427 doda 4422 HMAC_SHA1_96,
428     HMAC_MD5_96,
429 doda 4423 HMAC_RIPEMD160,
430 doda 4425 HMAC_SHA2_256,
431     HMAC_SHA2_256_96,
432     HMAC_SHA2_512,
433     HMAC_SHA2_512_96,
434 yutakapon 4367 HMAC_UNKNOWN,
435     HMAC_MAX = HMAC_UNKNOWN,
436 maya 4378 } hmac_type;
437 maya 4301
438 maya 3227 typedef struct ssh2_mac {
439 maya 4378 hmac_type type;
440 maya 3227 char *name;
441 maya 4378 const EVP_MD *(*evp_md)(void);
442 maya 3227 int truncatebits;
443     } ssh2_mac_t;
444    
445     static ssh2_mac_t ssh2_macs[] = {
446 maya 4592 {HMAC_SHA1, "hmac-sha1", EVP_sha1, 0}, // RFC4253
447     {HMAC_MD5, "hmac-md5", EVP_md5, 0}, // RFC4253
448     {HMAC_SHA1_96, "hmac-sha1-96", EVP_sha1, 96}, // RFC4253
449     {HMAC_MD5_96, "hmac-md5-96", EVP_md5, 96}, // RFC4253
450 doda 4425 {HMAC_RIPEMD160, "hmac-ripemd160@openssh.com", EVP_ripemd160, 0},
451 maya 4980 {HMAC_SHA2_256, "hmac-sha2-256", EVP_sha256, 0}, // RFC6668
452 doda 5016 // {HMAC_SHA2_256_96, "hmac-sha2-256-96", EVP_sha256, 96}, // draft-dbider-sha2-mac-for-ssh-05, deleted at 06
453 maya 4980 {HMAC_SHA2_512, "hmac-sha2-512", EVP_sha512, 0}, // RFC6668
454 doda 5016 // {HMAC_SHA2_512_96, "hmac-sha2-512-96", EVP_sha512, 96}, // draft-dbider-sha2-mac-for-ssh-05, deleted at 06
455 doda 4425 {HMAC_NONE, NULL, NULL, 0},
456 maya 3227 };
457    
458 maya 4301
459 maya 4378 typedef enum {
460     COMP_NONE, /* disabled line */
461     COMP_NOCOMP,
462 maya 4301 COMP_ZLIB,
463     COMP_DELAYED,
464 yutakapon 4367 COMP_UNKNOWN,
465     COMP_MAX = COMP_UNKNOWN,
466 maya 4378 } compression_type;
467 maya 3227
468 maya 4378 typedef struct ssh2_comp {
469     compression_type type;
470 maya 4301 char *name;
471 maya 4378 } ssh2_comp_t;
472 maya 3227
473 maya 4378 static ssh2_comp_t ssh2_comps[] = {
474 maya 4592 {COMP_NOCOMP, "none"}, // RFC4253
475     {COMP_ZLIB, "zlib"}, // RFC4253
476 maya 4301 {COMP_DELAYED, "zlib@openssh.com"},
477 maya 4378 {COMP_NONE, NULL},
478 maya 4301 };
479    
480    
481 maya 3227 struct Enc {
482     u_char *key;
483     u_char *iv;
484     unsigned int key_len;
485     unsigned int block_size;
486     };
487    
488     struct Mac {
489     char *name;
490     int enabled;
491     const EVP_MD *md;
492     int mac_len;
493     u_char *key;
494     int key_len;
495     };
496    
497     struct Comp {
498     int type;
499     int enabled;
500     char *name;
501     };
502    
503     typedef struct {
504     struct Enc enc;
505     struct Mac mac;
506     struct Comp comp;
507     } Newkeys;
508    
509     #define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
510    
511     enum kex_modes {
512     MODE_IN,
513     MODE_OUT,
514     MODE_MAX
515     };
516    
517    
518     // �z�X�g�L�[(SSH1, SSH2����)���f�[�^�\�� (2006.3.21 yutaka)
519     typedef struct Key {
520     // host key type
521 maya 4378 ssh_keytype type;
522 maya 3227 // SSH2 RSA
523     RSA *rsa;
524     // SSH2 DSA
525     DSA *dsa;
526 maya 4321 // SSH2 ECDSA
527     EC_KEY *ecdsa;
528 maya 3227 // SSH1 RSA
529     int bits;
530     unsigned char *exp;
531     unsigned char *mod;
532 yutakapon 5545 // SSH2 ED25519
533     unsigned char *ed25519_sk;
534     unsigned char *ed25519_pk;
535     int bcrypt_kdf;
536 maya 3227 } Key;
537    
538     // fingerprint������
539     enum fp_rep {
540 maya 6118 SSH_FP_DEFAULT = 0,
541 maya 3227 SSH_FP_HEX,
542 maya 6118 SSH_FP_BASE64,
543 maya 3227 SSH_FP_BUBBLEBABBLE,
544     SSH_FP_RANDOMART
545     };
546 maya 6120 /*
547 doda 4531 enum fp_type {
548 doda 4539 SSH_FP_MD5,
549 doda 4531 SSH_FP_SHA1,
550 doda 4539 SSH_FP_SHA256
551 doda 4531 };
552 maya 6120 */
553     typedef enum {
554     SSH_DIGEST_MD5,
555     SSH_DIGEST_RIPEMD160,
556     SSH_DIGEST_SHA1,
557     SSH_DIGEST_SHA256,
558     SSH_DIGEST_SHA384,
559     SSH_DIGEST_SHA512,
560     SSH_DIGEST_MAX,
561     } digest_algorithm;
562 doda 4531
563 maya 6120 typedef struct ssh_digest {
564     digest_algorithm id;
565 maya 6157 char *name;
566 maya 6120 } ssh_digest_t;
567    
568     /* NB. Indexed directly by algorithm number */
569     static ssh_digest_t ssh_digests[] = {
570 maya 6157 { SSH_DIGEST_MD5, "MD5" },
571     { SSH_DIGEST_RIPEMD160, "RIPEMD160" },
572     { SSH_DIGEST_SHA1, "SHA1" },
573     { SSH_DIGEST_SHA256, "SHA256" },
574     { SSH_DIGEST_SHA384, "SHA384" },
575     { SSH_DIGEST_SHA512, "SHA512" },
576     { SSH_DIGEST_MAX, NULL },
577 maya 6120 };
578    
579 maya 3227 enum scp_dir {
580 r850 3375 TOREMOTE, FROMREMOTE,
581 maya 3227 };
582    
583     /* The packet handler returns TRUE to keep the handler in place,
584     FALSE to remove the handler. */
585     typedef BOOL (* SSHPacketHandler)(PTInstVar pvar);
586    
587     typedef struct _SSHPacketHandlerItem SSHPacketHandlerItem;
588     struct _SSHPacketHandlerItem {
589     SSHPacketHandler handler;
590     /* Circular list of handlers for given message */
591 doda 6801 SSHPacketHandlerItem *next_for_message;
592     SSHPacketHandlerItem *last_for_message;
593 maya 3227 /* Circular list of handlers in set */
594 doda 6801 SSHPacketHandlerItem *next_in_set;
595 maya 3227 int active_for_message;
596     };
597    
598     typedef struct {
599 doda 6801 char *hostname;
600 maya 3227
601     int server_protocol_flags;
602 doda 6801 char *server_ID;
603 maya 3227
604     /* This buffer is used to hold the outgoing data, and encrypted in-place
605     here if necessary. */
606 doda 6801 unsigned char *outbuf;
607 maya 3227 long outbuflen;
608     /* This buffer is used by the SSH protocol processing to store uncompressed
609     packet data for compression. User data is never streamed through here;
610     it is compressed directly from the user's buffer. */
611 doda 6801 unsigned char *precompress_outbuf;
612 maya 3227 long precompress_outbuflen;
613     /* this is the length of the packet data, including the type header */
614     long outgoing_packet_len;
615    
616     /* This buffer is used by the SSH protocol processing to store decompressed
617     packet data. User data is never streamed through here; it is decompressed
618     directly to the user's buffer. */
619 doda 6801 unsigned char *postdecompress_inbuf;
620 maya 3227 long postdecompress_inbuflen;
621    
622 doda 6801 unsigned char *payload;
623 maya 3227 long payload_grabbed;
624     long payloadlen;
625     long payload_datastart;
626     long payload_datalen;
627    
628     uint32 receiver_sequence_number;
629     uint32 sender_sequence_number;
630    
631     z_stream compress_stream;
632     z_stream decompress_stream;
633     BOOL compressing;
634     BOOL decompressing;
635     int compression_level;
636    
637 doda 6801 SSHPacketHandlerItem *packet_handlers[256];
638 maya 3227 int status_flags;
639    
640     int win_cols;
641     int win_rows;
642    
643     unsigned short tcpport;
644     } SSHState;
645    
646     #define STATUS_DONT_SEND_USER_NAME 0x01
647     #define STATUS_EXPECTING_COMPRESSION_RESPONSE 0x02
648     #define STATUS_DONT_SEND_CREDENTIALS 0x04
649     #define STATUS_HOST_OK 0x08
650     #define STATUS_INTERACTIVE 0x10
651     #define STATUS_IN_PARTIAL_ID_STRING 0x20
652    
653     void SSH_init(PTInstVar pvar);
654     void SSH_open(PTInstVar pvar);
655 doda 6801 void SSH_notify_disconnecting(PTInstVar pvar, char *reason);
656 maya 3227 /* SSH_handle_server_ID returns TRUE iff a valid ID string has been
657     received. If it returns FALSE, we need to keep looking for another
658     ID string. */
659 doda 6801 BOOL SSH_handle_server_ID(PTInstVar pvar, char *ID, int ID_len);
660 maya 3227 /* SSH_handle_packet requires NO PAYLOAD on entry.
661     'len' is the size of the packet: payload + padding (+ CRC for SSHv1)
662     'padding' is the size of the padding.
663     'data' points to the start of the packet data (the length field)
664     */
665 doda 6801 void SSH_handle_packet(PTInstVar pvar, char *data, int len, int padding);
666 maya 3227 void SSH_notify_win_size(PTInstVar pvar, int cols, int rows);
667     void SSH_notify_user_name(PTInstVar pvar);
668     void SSH_notify_cred(PTInstVar pvar);
669     void SSH_notify_host_OK(PTInstVar pvar);
670 doda 6801 void SSH_send(PTInstVar pvar, unsigned char const *buf, unsigned int buflen);
671 maya 3227 /* SSH_extract_payload returns number of bytes extracted */
672 doda 6801 int SSH_extract_payload(PTInstVar pvar, unsigned char *dest, int len);
673 maya 3227 void SSH_end(PTInstVar pvar);
674    
675 doda 6801 void SSH_get_server_ID_info(PTInstVar pvar, char *dest, int len);
676     void SSH_get_protocol_version_info(PTInstVar pvar, char *dest, int len);
677     void SSH_get_compression_info(PTInstVar pvar, char *dest, int len);
678     void SSH_get_mac_info(PTInstVar pvar, char *dest, int len);
679 maya 3227
680     /* len must be <= SSH_MAX_SEND_PACKET_SIZE */
681     void SSH_channel_send(PTInstVar pvar, int channel_num,
682     uint32 remote_channel_num,
683 doda 6801 unsigned char *buf, int len, int retry);
684 maya 3227 void SSH_fail_channel_open(PTInstVar pvar, uint32 remote_channel_num);
685     void SSH_confirm_channel_open(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
686     void SSH_channel_output_eof(PTInstVar pvar, uint32 remote_channel_num);
687     void SSH_channel_input_eof(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
688 doda 6801 void SSH_request_forwarding(PTInstVar pvar, char *bind_address, int from_server_port,
689     char *to_local_host, int to_local_port);
690     void SSH_cancel_request_forwarding(PTInstVar pvar, char *bind_address, int from_server_port, int reply);
691 maya 3227 void SSH_request_X11_forwarding(PTInstVar pvar,
692 doda 6801 char *auth_protocol, unsigned char *auth_data, int auth_data_len, int screen_num);
693 maya 3227 void SSH_open_channel(PTInstVar pvar, uint32 local_channel_num,
694 doda 6801 char *to_remote_host, int to_remote_port,
695     char *originator, unsigned short originator_port);
696 maya 3227
697     int SSH_start_scp(PTInstVar pvar, char *sendfile, char *dstfile);
698     int SSH_start_scp_receive(PTInstVar pvar, char *filename);
699     int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction);
700     int SSH_sftp_transaction(PTInstVar pvar);
701    
702     /* auxiliary SSH2 interfaces for pkt.c */
703     int SSH_get_min_packet_size(PTInstVar pvar);
704     /* data is guaranteed to be at least SSH_get_min_packet_size bytes long
705     at least 5 bytes must be decrypted */
706 doda 6801 void SSH_predecrpyt_packet(PTInstVar pvar, char *data);
707 maya 3227 int SSH_get_clear_MAC_size(PTInstVar pvar);
708    
709     #define SSH_is_any_payload(pvar) ((pvar)->ssh_state.payload_datalen > 0)
710     #define SSH_get_host_name(pvar) ((pvar)->ssh_state.hostname)
711     #define SSH_get_compression_level(pvar) ((pvar)->ssh_state.compressing ? (pvar)->ts_SSH_CompressionLevel : 0)
712    
713     void SSH2_send_kexinit(PTInstVar pvar);
714     BOOL do_SSH2_userauth(PTInstVar pvar);
715     BOOL do_SSH2_authrequest(PTInstVar pvar);
716     void debug_print(int no, char *msg, int len);
717     int get_cipher_block_size(SSHCipher cipher);
718     int get_cipher_key_len(SSHCipher cipher);
719 yutakapon 5545 SSHCipher get_cipher_by_name(char *name);
720 maya 4378 char* get_kex_algorithm_name(kex_algorithm kextype);
721 maya 3227 const EVP_CIPHER* get_cipher_EVP_CIPHER(SSHCipher cipher);
722 maya 4378 const EVP_MD* get_kex_algorithm_EVP_MD(kex_algorithm kextype);
723     char* get_ssh2_mac_name(hmac_type type);
724     const EVP_MD* get_ssh2_mac_EVP_MD(hmac_type type);
725     int get_ssh2_mac_truncatebits(hmac_type type);
726     char* get_ssh2_comp_name(compression_type type);
727     char* get_ssh_keytype_name(ssh_keytype type);
728 maya 6120 char* get_digest_algorithm_name(digest_algorithm id);
729 maya 3227 int get_cipher_discard_len(SSHCipher cipher);
730     void ssh_heartbeat_lock_initialize(void);
731     void ssh_heartbeat_lock_finalize(void);
732     void ssh_heartbeat_lock(void);
733     void ssh_heartbeat_unlock(void);
734     void halt_ssh_heartbeat_thread(PTInstVar pvar);
735     void ssh2_channel_free(void);
736 doda 6657 BOOL handle_SSH2_userauth_msg60(PTInstVar pvar);
737 maya 3227 BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar);
738 doda 6657 BOOL handle_SSH2_userauth_pkok(PTInstVar pvar);
739 yutakapon 4152 BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar);
740 maya 3227 void SSH2_update_compression_myproposal(PTInstVar pvar);
741     void SSH2_update_cipher_myproposal(PTInstVar pvar);
742 yutakapon 4367 void SSH2_update_kex_myproposal(PTInstVar pvar);
743     void SSH2_update_host_key_myproposal(PTInstVar pvar);
744     void SSH2_update_hmac_myproposal(PTInstVar pvar);
745 yutakapon 4106 int SSH_notify_break_signal(PTInstVar pvar);
746 maya 3227
747 yutakapon 4926 ///
748     enum scp_state {
749     SCP_INIT, SCP_TIMESTAMP, SCP_FILEINFO, SCP_DATA, SCP_CLOSING,
750     };
751    
752     typedef struct bufchain {
753     buffer_t *msg;
754     struct bufchain *next;
755     } bufchain_t;
756    
757 yutakapon 6528 typedef struct PacketList {
758     char *buf;
759     unsigned int buflen;
760     struct PacketList *next;
761     } PacketList_t;
762    
763 yutakapon 4926 typedef struct scp {
764     enum scp_dir dir; // transfer direction
765     enum scp_state state; // SCP state
766     char localfile[MAX_PATH]; // local filename
767     char localfilefull[MAX_PATH]; // local filename fullpath
768     char remotefile[MAX_PATH]; // remote filename
769     FILE *localfp; // file pointer for local file
770     struct __stat64 filestat; // file status information
771     HWND progress_window;
772     HANDLE thread;
773     unsigned int thread_id;
774     PTInstVar pvar;
775     // for receiving file
776     long long filetotalsize;
777     long long filercvsize;
778 maya 5607 DWORD filemtime;
779     DWORD fileatime;
780 yutakapon 6528 PacketList_t *pktlist_head;
781     PacketList_t *pktlist_tail;
782 yutakapon 4926 } scp_t;
783    
784     enum sftp_state {
785 yutakapon 4930 SFTP_INIT, SFTP_CONNECTED, SFTP_REALPATH,
786 yutakapon 4926 };
787    
788     typedef struct sftp {
789     enum sftp_state state;
790 yutakapon 4930 HWND console_window;
791 yutakapon 4929 unsigned int transfer_buflen;
792     unsigned int num_requests;
793     unsigned int version;
794     unsigned int msg_id;
795     #define SFTP_EXT_POSIX_RENAME 0x00000001
796     #define SFTP_EXT_STATVFS 0x00000002
797     #define SFTP_EXT_FSTATVFS 0x00000004
798     #define SFTP_EXT_HARDLINK 0x00000008
799     unsigned int exts;
800     unsigned long long limit_kbps;
801     //struct bwlimit bwlimit_in, bwlimit_out;
802 yutakapon 4930 char path[1024];
803 yutakapon 4926 } sftp_t;
804    
805     typedef struct channel {
806     int used;
807     int self_id;
808     int remote_id;
809     unsigned int local_window;
810     unsigned int local_window_max;
811     unsigned int local_consumed;
812     unsigned int local_maxpacket;
813     unsigned int remote_window;
814     unsigned int remote_maxpacket;
815     enum channel_type type;
816     int local_num;
817     bufchain_t *bufchain;
818     scp_t scp;
819     buffer_t *agent_msg;
820     int agent_request_len;
821     sftp_t sftp;
822 maya 5422 #define SSH_CHANNEL_STATE_CLOSE_SENT 0x00000001
823     unsigned int state;
824 yutakapon 4926 } Channel_t;
825    
826 doda 6801 unsigned char *begin_send_packet(PTInstVar pvar, int type, int len);
827 yutakapon 4926 void finish_send_packet_special(PTInstVar pvar, int skip_compress);
828 doda 6801 void SSH2_send_channel_data(PTInstVar pvar, Channel_t *c, unsigned char *buf, unsigned int buflen, int retry);
829 yutakapon 4926
830     #define finish_send_packet(pvar) finish_send_packet_special((pvar), 0)
831     #define get_payload_uint32(pvar, offset) get_uint32_MSBfirst((pvar)->ssh_state.payload + (offset))
832     #define get_uint32(buf) get_uint32_MSBfirst((buf))
833     #define set_uint32(buf, v) set_uint32_MSBfirst((buf), (v))
834     #define get_mpint_len(pvar, offset) ((get_ushort16_MSBfirst((pvar)->ssh_state.payload + (offset)) + 7) >> 3)
835     #define get_ushort16(buf) get_ushort16_MSBfirst((buf))
836     ///
837    
838 doda 5916 /* Global request confirmation callbacks */
839     typedef void global_confirm_cb(PTInstVar pvar, int type, unsigned int seq, void *ctx);
840     void client_register_global_confirm(global_confirm_cb *cb, void *ctx);
841    
842     /* Global request success/failure callbacks */
843     struct global_confirm {
844     global_confirm_cb *cb;
845     void *ctx;
846     int ref_count;
847 yutakapon 5850 };
848    
849 maya 3227 #endif

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