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 7109 - (hide annotations) (download) (as text)
Mon May 28 07:49:43 2018 UTC (5 years, 10 months ago) by doda
Original Path: trunk/ttssh2/ttxssh/ssh.h
File MIME type: text/x-chdr
File size: 32553 byte(s)
typo fix
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 doda 6985 SSH2_CIPHER_AES128_GCM, SSH2_CIPHER_AES256_GCM,
99     SSH_CIPHER_MAX = SSH2_CIPHER_AES256_GCM,
100 doda 7004 } SSHCipherId;
101 maya 3227
102     typedef enum {
103     SSH_AUTH_NONE, SSH_AUTH_RHOSTS, SSH_AUTH_RSA, SSH_AUTH_PASSWORD,
104     SSH_AUTH_RHOSTS_RSA, SSH_AUTH_TIS, SSH_AUTH_KERBEROS,
105     SSH_AUTH_PAGEANT = 16,
106 maya 4378 SSH_AUTH_MAX = SSH_AUTH_PAGEANT,
107 maya 3227 } SSHAuthMethod;
108    
109     typedef enum {
110     SSH_GENERIC_AUTHENTICATION, SSH_TIS_AUTHENTICATION
111     } SSHAuthMode;
112    
113     #define SSH_PROTOFLAG_SCREEN_NUMBER 1
114     #define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 2
115    
116     enum channel_type {
117 doda 6717 TYPE_SHELL, TYPE_PORTFWD, TYPE_SCP, TYPE_SFTP, TYPE_AGENT, TYPE_SUBSYSTEM_GEN,
118 maya 3227 };
119    
120     // for SSH1
121     #define SSH_MAX_SEND_PACKET_SIZE 250000
122    
123     // for SSH2
124     /* default window/packet sizes for tcp/x11-fwd-channel */
125     // changed CHAN_SES_WINDOW_DEFAULT from 32KB to 128KB. (2007.10.29 maya)
126     #define CHAN_SES_PACKET_DEFAULT (32*1024)
127     #define CHAN_SES_WINDOW_DEFAULT (4*CHAN_SES_PACKET_DEFAULT)
128     #define CHAN_TCP_PACKET_DEFAULT (32*1024)
129     #define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT)
130     #if 0 // unused
131     #define CHAN_X11_PACKET_DEFAULT (16*1024)
132     #define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT)
133     #endif
134    
135    
136     /* SSH2 constants */
137 doda 7107 #define SSH_CHANNEL_INVALID -1
138 maya 3227
139     /* SSH2 messages */
140 doda 6950 typedef enum {
141     // Transport layer protocol
142     // 1..19 Transport layer generic (RFC 4253)
143     SSH2_MSG_DISCONNECT = 1,
144     SSH2_MSG_IGNORE = 2,
145     SSH2_MSG_UNIMPLEMENTED = 3,
146     SSH2_MSG_DEBUG = 4,
147     SSH2_MSG_SERVICE_REQUEST = 5,
148     SSH2_MSG_SERVICE_ACCEPT = 6,
149 maya 3227
150 doda 6950 // 20..29 Algorithm negotiation (RFC 4253)
151     SSH2_MSG_KEXINIT = 20,
152     SSH2_MSG_NEWKEYS = 21,
153 maya 3227
154 doda 6950 // 30..49 Key excahnge method specific
155     // Diffie-Hellman Key Exchange (RFC 4253)
156     SSH2_MSG_KEXDH_INIT = 30,
157     SSH2_MSG_KEXDH_REPLY = 31,
158 maya 3227
159 doda 6950 // RFC 4419 - Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol
160     SSH2_MSG_KEX_DH_GEX_GROUP = 31,
161     SSH2_MSG_KEX_DH_GEX_INIT = 32,
162     SSH2_MSG_KEX_DH_GEX_REPLY = 33,
163     SSH2_MSG_KEX_DH_GEX_REQUEST = 34,
164 maya 3227
165 doda 6950 // RFC 5656 - Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer
166     SSH2_MSG_KEX_ECDH_INIT = 30,
167     SSH2_MSG_KEX_ECDH_REPLY = 31,
168 maya 4314
169 doda 6950 // User authentication protocol
170     // 50..59 User authentication generic (RFC 4252)
171     SSH2_MSG_USERAUTH_REQUEST = 50,
172     SSH2_MSG_USERAUTH_FAILURE = 51,
173     SSH2_MSG_USERAUTH_SUCCESS = 52,
174     SSH2_MSG_USERAUTH_BANNER = 53,
175 maya 3227
176 doda 6950 // Public key authentication (RFC 4252)
177     SSH2_MSG_USERAUTH_PK_OK = 60,
178 maya 3227
179 doda 6950 // Password authentication (RFC 4252)
180     SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ = 60,
181 maya 3227
182 doda 6950 // RFC 4256 - Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)
183     // Keyboard-interactive authentication
184     SSH2_MSG_USERAUTH_INFO_REQUEST = 60,
185     SSH2_MSG_USERAUTH_INFO_RESPONSE = 61,
186    
187     // Connection protocol
188     // 80..89 Connection protocol generic (RFC 4254)
189     SSH2_MSG_GLOBAL_REQUEST = 80,
190     SSH2_MSG_REQUEST_SUCCESS = 81,
191     SSH2_MSG_REQUEST_FAILURE = 82,
192    
193     // 90..127 Channel related messages (RFC 4254)
194     SSH2_MSG_CHANNEL_OPEN = 90,
195     SSH2_MSG_CHANNEL_OPEN_CONFIRMATION = 91,
196     SSH2_MSG_CHANNEL_OPEN_FAILURE = 92,
197     SSH2_MSG_CHANNEL_WINDOW_ADJUST = 93,
198     SSH2_MSG_CHANNEL_DATA = 94,
199     SSH2_MSG_CHANNEL_EXTENDED_DATA = 95,
200     SSH2_MSG_CHANNEL_EOF = 96,
201     SSH2_MSG_CHANNEL_CLOSE = 97,
202     SSH2_MSG_CHANNEL_REQUEST = 98,
203     SSH2_MSG_CHANNEL_SUCCESS = 99,
204     SSH2_MSG_CHANNEL_FAILURE = 100
205    
206     // Reserved for client protocols
207     // 128..191 Reserved
208    
209     // Local extensions:
210     // 192..255 Local extensions
211    
212     } SSH2Message;
213    
214 maya 3227 /* SSH2 miscellaneous constants */
215 doda 6950 typedef enum {
216     SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT = 1,
217     SSH2_DISCONNECT_PROTOCOL_ERROR,
218     SSH2_DISCONNECT_KEY_EXCHANGE_FAILED,
219     SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED,
220     SSH2_DISCONNECT_MAC_ERROR,
221     SSH2_DISCONNECT_COMPRESSION_ERROR,
222     SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE,
223     SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED,
224     SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE,
225     SSH2_DISCONNECT_CONNECTION_LOST,
226     SSH2_DISCONNECT_BY_APPLICATION,
227     SSH2_DISCONNECT_TOO_MANY_CONNECTIONS,
228     SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
229     SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
230     SSH2_DISCONNECT_ILLEGAL_USER_NAME
231     } SSH2DisconnectMessage;
232 maya 3227
233 doda 6950 typedef enum {
234     SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED = 1,
235     SSH2_OPEN_CONNECT_FAILED,
236     SSH2_OPEN_UNKNOWN_CHANNEL_TYPE,
237     SSH2_OPEN_RESOURCE_SHORTAGE
238     } SSH2ChannelFailReason;
239 maya 3227
240 doda 5587 // Terminal Modes
241 doda 6950 typedef enum {
242     SSH2_TTY_OP_END = 0,
243     SSH2_TTY_KEY_VINTR = 1,
244     SSH2_TTY_KEY_VQUIT = 2,
245     SSH2_TTY_KEY_VERASE = 3,
246     SSH2_TTY_KEY_VKILL = 4,
247     SSH2_TTY_KEY_VEOF = 5,
248     SSH2_TTY_KEY_VEOL = 6,
249     SSH2_TTY_KEY_VEOL2 = 7,
250     SSH2_TTY_KEY_VSTART = 8,
251     SSH2_TTY_KEY_VSTOP = 9,
252     SSH2_TTY_KEY_VSUSP = 10,
253     SSH2_TTY_KEY_VDSUSP = 11,
254     SSH2_TTY_KEY_VREPRINT = 12,
255     SSH2_TTY_KEY_VWERASE = 13,
256     SSH2_TTY_KEY_VLNEXT = 14,
257     SSH2_TTY_KEY_VFLUSH = 15,
258     SSH2_TTY_KEY_VSWTCH = 16,
259     SSH2_TTY_KEY_VSTATUS = 17,
260     SSH2_TTY_KEY_VDISCARD = 18,
261     SSH2_TTY_OP_IGNPAR = 30,
262     SSH2_TTY_OP_PARMRK = 31,
263     SSH2_TTY_OP_INPCK = 32,
264     SSH2_TTY_OP_ISTRIP = 33,
265     SSH2_TTY_OP_INLCR = 34,
266     SSH2_TTY_OP_IGNCR = 35,
267     SSH2_TTY_OP_ICRNL = 36,
268     SSH2_TTY_OP_IUCLC = 37,
269     SSH2_TTY_OP_IXON = 38,
270     SSH2_TTY_OP_IXANY = 39,
271     SSH2_TTY_OP_IXOFF = 40,
272     SSH2_TTY_OP_IMAXBEL = 41,
273     SSH2_TTY_OP_ISIG = 50,
274     SSH2_TTY_OP_ICANON = 51,
275     SSH2_TTY_OP_XCASE = 52,
276     SSH2_TTY_OP_ECHO = 53,
277     SSH2_TTY_OP_ECHOE = 54,
278     SSH2_TTY_OP_ECHOK = 55,
279     SSH2_TTY_OP_ECHONL = 56,
280     SSH2_TTY_OP_NOFLSH = 57,
281     SSH2_TTY_OP_TOSTOP = 58,
282     SSH2_TTY_OP_IEXTEN = 59,
283     SSH2_TTY_OP_ECHOCTL = 60,
284     SSH2_TTY_OP_ECHOKE = 61,
285     SSH2_TTY_OP_PENDIN = 62,
286     SSH2_TTY_OP_OPOST = 70,
287     SSH2_TTY_OP_OLCUC = 71,
288     SSH2_TTY_OP_ONLCR = 72,
289     SSH2_TTY_OP_OCRNL = 73,
290     SSH2_TTY_OP_ONOCR = 74,
291     SSH2_TTY_OP_ONLRET = 75,
292     SSH2_TTY_OP_CS7 = 90,
293     SSH2_TTY_OP_CS8 = 91,
294     SSH2_TTY_OP_PARENB = 92,
295     SSH2_TTY_OP_PARODD = 93,
296     SSH2_TTY_OP_ISPEED = 128,
297     SSH2_TTY_OP_OSPEED = 129
298     } SSH2TTYMode;
299 maya 3227
300 doda 5587
301 maya 4378 // �N���C�A���g�����T�[�o������������
302 maya 3227 enum kex_init_proposals {
303     PROPOSAL_KEX_ALGS,
304     PROPOSAL_SERVER_HOST_KEY_ALGS,
305     PROPOSAL_ENC_ALGS_CTOS,
306     PROPOSAL_ENC_ALGS_STOC,
307     PROPOSAL_MAC_ALGS_CTOS,
308     PROPOSAL_MAC_ALGS_STOC,
309     PROPOSAL_COMP_ALGS_CTOS,
310     PROPOSAL_COMP_ALGS_STOC,
311     PROPOSAL_LANG_CTOS,
312     PROPOSAL_LANG_STOC,
313     PROPOSAL_MAX
314     };
315    
316 maya 4378 #define KEX_DEFAULT_KEX ""
317     #define KEX_DEFAULT_PK_ALG ""
318     #define KEX_DEFAULT_ENCRYPT ""
319     #define KEX_DEFAULT_MAC ""
320     #define KEX_DEFAULT_COMP ""
321     #define KEX_DEFAULT_LANG ""
322 maya 3227
323     static char *myproposal[PROPOSAL_MAX] = {
324     KEX_DEFAULT_KEX,
325     KEX_DEFAULT_PK_ALG,
326     KEX_DEFAULT_ENCRYPT,
327     KEX_DEFAULT_ENCRYPT,
328     KEX_DEFAULT_MAC,
329     KEX_DEFAULT_MAC,
330     KEX_DEFAULT_COMP,
331     KEX_DEFAULT_COMP,
332     KEX_DEFAULT_LANG,
333     KEX_DEFAULT_LANG,
334     };
335    
336    
337 maya 4378 typedef enum {
338     KEY_NONE,
339     KEY_RSA1,
340     KEY_RSA,
341     KEY_DSA,
342     KEY_ECDSA256,
343     KEY_ECDSA384,
344     KEY_ECDSA521,
345 yutakapon 5545 KEY_ED25519,
346 maya 4378 KEY_UNSPEC,
347     KEY_MAX = KEY_UNSPEC,
348     } ssh_keytype;
349 yutakapon 5545 #define isFixedLengthKey(type) ((type) >= KEY_DSA && (type) <= KEY_ED25519)
350 maya 4378
351     typedef struct ssh2_host_key {
352     ssh_keytype type;
353     char *name;
354     } ssh2_host_key_t;
355    
356     static ssh2_host_key_t ssh2_host_key[] = {
357 maya 4592 {KEY_RSA1, "ssh-rsa1"}, // for SSH1 only
358     {KEY_RSA, "ssh-rsa"}, // RFC4253
359     {KEY_DSA, "ssh-dss"}, // RFC4253
360     {KEY_ECDSA256, "ecdsa-sha2-nistp256"}, // RFC5656
361     {KEY_ECDSA384, "ecdsa-sha2-nistp384"}, // RFC5656
362     {KEY_ECDSA521, "ecdsa-sha2-nistp521"}, // RFC5656
363 maya 6270 {KEY_ED25519, "ssh-ed25519"}, // draft-bjh21-ssh-ed25519-02
364 maya 4378 {KEY_UNSPEC, "ssh-unknown"},
365     {KEY_NONE, NULL},
366     };
367    
368     /* Minimum modulus size (n) for RSA keys. */
369     #define SSH_RSA_MINIMUM_MODULUS_SIZE 768
370    
371     #define SSH_KEYGEN_DEFAULT_BITS 2048
372     #define SSH_RSA_MINIMUM_KEY_SIZE 768
373     #define SSH_DSA_MINIMUM_KEY_SIZE 1024
374    
375 maya 5765 #define SSH_KEYGEN_MINIMUM_ROUNDS 1
376     #define SSH_KEYGEN_MAXIMUM_ROUNDS INT_MAX
377 maya 4378
378 maya 5765
379 maya 3227 typedef struct ssh2_cipher {
380 doda 7004 SSHCipherId id;
381 maya 3227 char *name;
382     int block_size;
383     int key_len;
384     int discard_len;
385 doda 6985 int iv_len;
386     int auth_len;
387 maya 3227 const EVP_CIPHER *(*func)(void);
388 doda 7004 } SSH2Cipher;
389 maya 3227
390 doda 7004 static SSH2Cipher ssh2_ciphers[] = {
391 doda 6985 {SSH2_CIPHER_3DES_CBC, "3des-cbc", 8, 24, 0, 0, 0, EVP_des_ede3_cbc}, // RFC4253
392     {SSH2_CIPHER_AES128_CBC, "aes128-cbc", 16, 16, 0, 0, 0, EVP_aes_128_cbc}, // RFC4253
393     {SSH2_CIPHER_AES192_CBC, "aes192-cbc", 16, 24, 0, 0, 0, EVP_aes_192_cbc}, // RFC4253
394     {SSH2_CIPHER_AES256_CBC, "aes256-cbc", 16, 32, 0, 0, 0, EVP_aes_256_cbc}, // RFC4253
395     {SSH2_CIPHER_BLOWFISH_CBC, "blowfish-cbc", 8, 16, 0, 0, 0, EVP_bf_cbc}, // RFC4253
396     {SSH2_CIPHER_AES128_CTR, "aes128-ctr", 16, 16, 0, 0, 0, evp_aes_128_ctr}, // RFC4344
397     {SSH2_CIPHER_AES192_CTR, "aes192-ctr", 16, 24, 0, 0, 0, evp_aes_128_ctr}, // RFC4344
398     {SSH2_CIPHER_AES256_CTR, "aes256-ctr", 16, 32, 0, 0, 0, evp_aes_128_ctr}, // RFC4344
399     {SSH2_CIPHER_ARCFOUR, "arcfour", 8, 16, 0, 0, 0, EVP_rc4}, // RFC4253
400     {SSH2_CIPHER_ARCFOUR128, "arcfour128", 8, 16, 1536, 0, 0, EVP_rc4}, // RFC4345
401     {SSH2_CIPHER_ARCFOUR256, "arcfour256", 8, 32, 1536, 0, 0, EVP_rc4}, // RFC4345
402     {SSH2_CIPHER_CAST128_CBC, "cast128-cbc", 8, 16, 0, 0, 0, EVP_cast5_cbc}, // RFC4253
403     {SSH2_CIPHER_3DES_CTR, "3des-ctr", 8, 24, 0, 0, 0, evp_des3_ctr}, // RFC4344
404     {SSH2_CIPHER_BLOWFISH_CTR, "blowfish-ctr", 8, 32, 0, 0, 0, evp_bf_ctr}, // RFC4344
405     {SSH2_CIPHER_CAST128_CTR, "cast128-ctr", 8, 16, 0, 0, 0, evp_cast5_ctr}, // RFC4344
406     {SSH2_CIPHER_CAMELLIA128_CBC, "camellia128-cbc", 16, 16, 0, 0, 0, EVP_camellia_128_cbc}, // draft-kanno-secsh-camellia-02
407     {SSH2_CIPHER_CAMELLIA192_CBC, "camellia192-cbc", 16, 24, 0, 0, 0, EVP_camellia_192_cbc}, // draft-kanno-secsh-camellia-02
408     {SSH2_CIPHER_CAMELLIA256_CBC, "camellia256-cbc", 16, 32, 0, 0, 0, EVP_camellia_256_cbc}, // draft-kanno-secsh-camellia-02
409     {SSH2_CIPHER_CAMELLIA128_CTR, "camellia128-ctr", 16, 16, 0, 0, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
410     {SSH2_CIPHER_CAMELLIA192_CTR, "camellia192-ctr", 16, 24, 0, 0, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
411     {SSH2_CIPHER_CAMELLIA256_CTR, "camellia256-ctr", 16, 32, 0, 0, 0, evp_camellia_128_ctr}, // draft-kanno-secsh-camellia-02
412 doda 4433 #ifdef WITH_CAMELLIA_PRIVATE
413 doda 6985 {SSH2_CIPHER_CAMELLIA128_CBC, "camellia128-cbc@openssh.org", 16, 16, 0, 0, 0, EVP_camellia_128_cbc},
414     {SSH2_CIPHER_CAMELLIA192_CBC, "camellia192-cbc@openssh.org", 16, 24, 0, 0, 0, EVP_camellia_192_cbc},
415     {SSH2_CIPHER_CAMELLIA256_CBC, "camellia256-cbc@openssh.org", 16, 32, 0, 0, 0, EVP_camellia_256_cbc},
416     {SSH2_CIPHER_CAMELLIA128_CTR, "camellia128-ctr@openssh.org", 16, 16, 0, 0, 0, evp_camellia_128_ctr},
417     {SSH2_CIPHER_CAMELLIA192_CTR, "camellia192-ctr@openssh.org", 16, 24, 0, 0, 0, evp_camellia_128_ctr},
418     {SSH2_CIPHER_CAMELLIA256_CTR, "camellia256-ctr@openssh.org", 16, 32, 0, 0, 0, evp_camellia_128_ctr},
419 doda 4433 #endif // WITH_CAMELLIA_PRIVATE
420 maya 6990 {SSH2_CIPHER_AES128_GCM, "aes128-gcm@openssh.com", 16, 16, 0, 12, 16, EVP_aes_128_gcm}, // not RFC5647, PROTOCOL of OpenSSH
421     {SSH2_CIPHER_AES256_GCM, "aes256-gcm@openssh.com", 16, 32, 0, 12, 16, EVP_aes_256_gcm}, // not RFC5647, PROTOCOL of OpenSSH
422 doda 6985 {SSH_CIPHER_NONE, NULL, 0, 0, 0, 0, 0, NULL},
423 maya 3227 };
424    
425    
426 maya 4378 typedef enum {
427 yutakapon 4367 KEX_DH_NONE, /* disabled line */
428 maya 4301 KEX_DH_GRP1_SHA1,
429     KEX_DH_GRP14_SHA1,
430     KEX_DH_GEX_SHA1,
431     KEX_DH_GEX_SHA256,
432 maya 4314 KEX_ECDH_SHA2_256,
433     KEX_ECDH_SHA2_384,
434     KEX_ECDH_SHA2_521,
435 doda 6263 KEX_DH_GRP14_SHA256,
436 doda 6310 KEX_DH_GRP16_SHA512,
437     KEX_DH_GRP18_SHA512,
438 maya 4301 KEX_DH_UNKNOWN,
439 yutakapon 4367 KEX_DH_MAX = KEX_DH_UNKNOWN,
440 maya 4378 } kex_algorithm;
441 maya 4301
442     typedef struct ssh2_kex_algorithm {
443 maya 4378 kex_algorithm kextype;
444 maya 4301 char *name;
445     const EVP_MD *(*evp_md)(void);
446     } ssh2_kex_algorithm_t;
447    
448     static ssh2_kex_algorithm_t ssh2_kex_algorithms[] = {
449 maya 4592 {KEX_DH_GRP1_SHA1, "diffie-hellman-group1-sha1", EVP_sha1}, // RFC4253
450     {KEX_DH_GRP14_SHA1, "diffie-hellman-group14-sha1", EVP_sha1}, // RFC4253
451     {KEX_DH_GEX_SHA1, "diffie-hellman-group-exchange-sha1", EVP_sha1}, // RFC4419
452     {KEX_DH_GEX_SHA256, "diffie-hellman-group-exchange-sha256", EVP_sha256}, // RFC4419
453     {KEX_ECDH_SHA2_256, "ecdh-sha2-nistp256", EVP_sha256}, // RFC5656
454     {KEX_ECDH_SHA2_384, "ecdh-sha2-nistp384", EVP_sha384}, // RFC5656
455     {KEX_ECDH_SHA2_521, "ecdh-sha2-nistp521", EVP_sha512}, // RFC5656
456 doda 7025 {KEX_DH_GRP14_SHA256, "diffie-hellman-group14-sha256", EVP_sha256}, // RFC8268
457     {KEX_DH_GRP16_SHA512, "diffie-hellman-group16-sha512", EVP_sha512}, // RFC8268
458     {KEX_DH_GRP18_SHA512, "diffie-hellman-group18-sha512", EVP_sha512}, // RFC8268
459 maya 4378 {KEX_DH_NONE , NULL, NULL},
460 maya 4301 };
461    
462    
463 maya 4378 typedef enum {
464     HMAC_NONE, /* disabled line */
465 maya 4301 HMAC_SHA1,
466     HMAC_MD5,
467 doda 4422 HMAC_SHA1_96,
468     HMAC_MD5_96,
469 doda 4423 HMAC_RIPEMD160,
470 doda 4425 HMAC_SHA2_256,
471     HMAC_SHA2_256_96,
472     HMAC_SHA2_512,
473     HMAC_SHA2_512_96,
474 doda 6969 HMAC_SHA1_EtM,
475     HMAC_MD5_EtM,
476     HMAC_SHA1_96_EtM,
477     HMAC_MD5_96_EtM,
478     HMAC_RIPEMD160_EtM,
479     HMAC_SHA2_256_EtM,
480     HMAC_SHA2_512_EtM,
481 doda 7007 HMAC_IMPLICIT,
482 yutakapon 4367 HMAC_UNKNOWN,
483     HMAC_MAX = HMAC_UNKNOWN,
484 doda 7006 } SSH2MacId;
485 maya 4301
486 maya 3227 typedef struct ssh2_mac {
487 doda 7006 SSH2MacId id;
488 maya 3227 char *name;
489 maya 4378 const EVP_MD *(*evp_md)(void);
490 maya 3227 int truncatebits;
491 doda 6969 int etm;
492 doda 7006 } SSH2Mac;
493 maya 3227
494 doda 7006 static SSH2Mac ssh2_macs[] = {
495 doda 6969 {HMAC_SHA1, "hmac-sha1", EVP_sha1, 0, 0}, // RFC4253
496     {HMAC_MD5, "hmac-md5", EVP_md5, 0, 0}, // RFC4253
497     {HMAC_SHA1_96, "hmac-sha1-96", EVP_sha1, 96, 0}, // RFC4253
498     {HMAC_MD5_96, "hmac-md5-96", EVP_md5, 96, 0}, // RFC4253
499     {HMAC_RIPEMD160, "hmac-ripemd160@openssh.com", EVP_ripemd160, 0, 0},
500     {HMAC_SHA2_256, "hmac-sha2-256", EVP_sha256, 0, 0}, // RFC6668
501     // {HMAC_SHA2_256_96, "hmac-sha2-256-96", EVP_sha256, 96, 0}, // draft-dbider-sha2-mac-for-ssh-05, deleted at 06
502     {HMAC_SHA2_512, "hmac-sha2-512", EVP_sha512, 0, 0}, // RFC6668
503     // {HMAC_SHA2_512_96, "hmac-sha2-512-96", EVP_sha512, 96, 0}, // draft-dbider-sha2-mac-for-ssh-05, deleted at 06
504     {HMAC_SHA1_EtM, "hmac-sha1-etm@openssh.com", EVP_sha1, 0, 1},
505     {HMAC_MD5_EtM, "hmac-md5-etm@openssh.com", EVP_md5, 0, 1},
506 doda 6971 {HMAC_SHA1_96_EtM, "hmac-sha1-96-etm@openssh.com", EVP_sha1, 96, 1},
507     {HMAC_MD5_96_EtM, "hmac-md5-96-etm@openssh.com", EVP_md5, 96, 1},
508 doda 6969 {HMAC_RIPEMD160_EtM,"hmac-ripemd160-etm@openssh.com",EVP_ripemd160, 0, 1},
509     {HMAC_SHA2_256_EtM, "hmac-sha2-256-etm@openssh.com", EVP_sha256, 0, 1},
510     {HMAC_SHA2_512_EtM, "hmac-sha2-512-etm@openssh.com", EVP_sha512, 0, 1},
511 doda 7007 {HMAC_IMPLICIT, "<implicit>", EVP_md_null, 0, 0}, // for AEAD cipher
512 doda 6969 {HMAC_NONE, NULL, NULL, 0, 0},
513 maya 3227 };
514    
515 maya 4301
516 maya 4378 typedef enum {
517     COMP_NONE, /* disabled line */
518     COMP_NOCOMP,
519 maya 4301 COMP_ZLIB,
520     COMP_DELAYED,
521 yutakapon 4367 COMP_UNKNOWN,
522     COMP_MAX = COMP_UNKNOWN,
523 maya 4378 } compression_type;
524 maya 3227
525 maya 4378 typedef struct ssh2_comp {
526     compression_type type;
527 maya 4301 char *name;
528 maya 4378 } ssh2_comp_t;
529 maya 3227
530 maya 4378 static ssh2_comp_t ssh2_comps[] = {
531 maya 4592 {COMP_NOCOMP, "none"}, // RFC4253
532     {COMP_ZLIB, "zlib"}, // RFC4253
533 maya 4301 {COMP_DELAYED, "zlib@openssh.com"},
534 maya 4378 {COMP_NONE, NULL},
535 maya 4301 };
536    
537    
538 maya 3227 struct Enc {
539     u_char *key;
540     u_char *iv;
541     unsigned int key_len;
542     unsigned int block_size;
543 doda 6985 unsigned int iv_len;
544     unsigned int auth_len;
545 maya 3227 };
546    
547     struct Mac {
548 doda 6984 char *name;
549     int enabled;
550 maya 3227 const EVP_MD *md;
551 doda 6984 unsigned int mac_len;
552 maya 3227 u_char *key;
553 doda 6984 unsigned int key_len;
554     int etm;
555 maya 3227 };
556    
557     struct Comp {
558     int type;
559     int enabled;
560     char *name;
561     };
562    
563     typedef struct {
564     struct Enc enc;
565     struct Mac mac;
566     struct Comp comp;
567 doda 7001 } SSHKeys;
568 maya 3227
569     #define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
570    
571     enum kex_modes {
572     MODE_IN,
573     MODE_OUT,
574     MODE_MAX
575     };
576    
577    
578     // �z�X�g�L�[(SSH1, SSH2����)���f�[�^�\�� (2006.3.21 yutaka)
579     typedef struct Key {
580     // host key type
581 maya 4378 ssh_keytype type;
582 maya 3227 // SSH2 RSA
583     RSA *rsa;
584     // SSH2 DSA
585     DSA *dsa;
586 maya 4321 // SSH2 ECDSA
587     EC_KEY *ecdsa;
588 maya 3227 // SSH1 RSA
589     int bits;
590     unsigned char *exp;
591     unsigned char *mod;
592 yutakapon 5545 // SSH2 ED25519
593     unsigned char *ed25519_sk;
594     unsigned char *ed25519_pk;
595     int bcrypt_kdf;
596 maya 3227 } Key;
597    
598     // fingerprint������
599     enum fp_rep {
600 maya 6118 SSH_FP_DEFAULT = 0,
601 maya 3227 SSH_FP_HEX,
602 maya 6118 SSH_FP_BASE64,
603 maya 3227 SSH_FP_BUBBLEBABBLE,
604     SSH_FP_RANDOMART
605     };
606 maya 6120 /*
607 doda 4531 enum fp_type {
608 doda 4539 SSH_FP_MD5,
609 doda 4531 SSH_FP_SHA1,
610 doda 4539 SSH_FP_SHA256
611 doda 4531 };
612 maya 6120 */
613     typedef enum {
614     SSH_DIGEST_MD5,
615     SSH_DIGEST_RIPEMD160,
616     SSH_DIGEST_SHA1,
617     SSH_DIGEST_SHA256,
618     SSH_DIGEST_SHA384,
619     SSH_DIGEST_SHA512,
620     SSH_DIGEST_MAX,
621     } digest_algorithm;
622 doda 4531
623 maya 6120 typedef struct ssh_digest {
624     digest_algorithm id;
625 maya 6157 char *name;
626 maya 6120 } ssh_digest_t;
627    
628     /* NB. Indexed directly by algorithm number */
629     static ssh_digest_t ssh_digests[] = {
630 maya 6157 { SSH_DIGEST_MD5, "MD5" },
631     { SSH_DIGEST_RIPEMD160, "RIPEMD160" },
632     { SSH_DIGEST_SHA1, "SHA1" },
633     { SSH_DIGEST_SHA256, "SHA256" },
634     { SSH_DIGEST_SHA384, "SHA384" },
635     { SSH_DIGEST_SHA512, "SHA512" },
636     { SSH_DIGEST_MAX, NULL },
637 maya 6120 };
638    
639 maya 3227 enum scp_dir {
640 r850 3375 TOREMOTE, FROMREMOTE,
641 maya 3227 };
642    
643     /* The packet handler returns TRUE to keep the handler in place,
644     FALSE to remove the handler. */
645     typedef BOOL (* SSHPacketHandler)(PTInstVar pvar);
646    
647     typedef struct _SSHPacketHandlerItem SSHPacketHandlerItem;
648     struct _SSHPacketHandlerItem {
649     SSHPacketHandler handler;
650     /* Circular list of handlers for given message */
651 doda 6801 SSHPacketHandlerItem *next_for_message;
652     SSHPacketHandlerItem *last_for_message;
653 maya 3227 /* Circular list of handlers in set */
654 doda 6801 SSHPacketHandlerItem *next_in_set;
655 maya 3227 int active_for_message;
656     };
657    
658     typedef struct {
659 doda 6801 char *hostname;
660 maya 3227
661     int server_protocol_flags;
662 doda 6801 char *server_ID;
663 maya 3227
664     /* This buffer is used to hold the outgoing data, and encrypted in-place
665     here if necessary. */
666 doda 6801 unsigned char *outbuf;
667 maya 3227 long outbuflen;
668     /* This buffer is used by the SSH protocol processing to store uncompressed
669     packet data for compression. User data is never streamed through here;
670     it is compressed directly from the user's buffer. */
671 doda 6801 unsigned char *precompress_outbuf;
672 maya 3227 long precompress_outbuflen;
673     /* this is the length of the packet data, including the type header */
674     long outgoing_packet_len;
675    
676     /* This buffer is used by the SSH protocol processing to store decompressed
677     packet data. User data is never streamed through here; it is decompressed
678     directly to the user's buffer. */
679 doda 6801 unsigned char *postdecompress_inbuf;
680 maya 3227 long postdecompress_inbuflen;
681    
682 doda 6801 unsigned char *payload;
683 maya 3227 long payload_grabbed;
684     long payloadlen;
685     long payload_datastart;
686     long payload_datalen;
687    
688     uint32 receiver_sequence_number;
689     uint32 sender_sequence_number;
690    
691     z_stream compress_stream;
692     z_stream decompress_stream;
693     BOOL compressing;
694     BOOL decompressing;
695     int compression_level;
696    
697 doda 6801 SSHPacketHandlerItem *packet_handlers[256];
698 maya 3227 int status_flags;
699    
700     int win_cols;
701     int win_rows;
702    
703     unsigned short tcpport;
704     } SSHState;
705    
706     #define STATUS_DONT_SEND_USER_NAME 0x01
707     #define STATUS_EXPECTING_COMPRESSION_RESPONSE 0x02
708     #define STATUS_DONT_SEND_CREDENTIALS 0x04
709     #define STATUS_HOST_OK 0x08
710     #define STATUS_INTERACTIVE 0x10
711     #define STATUS_IN_PARTIAL_ID_STRING 0x20
712    
713     void SSH_init(PTInstVar pvar);
714     void SSH_open(PTInstVar pvar);
715 doda 6801 void SSH_notify_disconnecting(PTInstVar pvar, char *reason);
716 maya 3227 /* SSH_handle_server_ID returns TRUE iff a valid ID string has been
717     received. If it returns FALSE, we need to keep looking for another
718     ID string. */
719 doda 6801 BOOL SSH_handle_server_ID(PTInstVar pvar, char *ID, int ID_len);
720 maya 3227 /* SSH_handle_packet requires NO PAYLOAD on entry.
721     'len' is the size of the packet: payload + padding (+ CRC for SSHv1)
722     'padding' is the size of the padding.
723     'data' points to the start of the packet data (the length field)
724     */
725 doda 6982 void SSH1_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int padding);
726 doda 6985 void SSH2_handle_packet(PTInstVar pvar, char *data, unsigned int len, unsigned int aadlen, unsigned int authlen);
727 maya 3227 void SSH_notify_win_size(PTInstVar pvar, int cols, int rows);
728     void SSH_notify_user_name(PTInstVar pvar);
729     void SSH_notify_cred(PTInstVar pvar);
730     void SSH_notify_host_OK(PTInstVar pvar);
731 doda 6801 void SSH_send(PTInstVar pvar, unsigned char const *buf, unsigned int buflen);
732 maya 3227 /* SSH_extract_payload returns number of bytes extracted */
733 doda 6801 int SSH_extract_payload(PTInstVar pvar, unsigned char *dest, int len);
734 maya 3227 void SSH_end(PTInstVar pvar);
735    
736 doda 6801 void SSH_get_server_ID_info(PTInstVar pvar, char *dest, int len);
737     void SSH_get_protocol_version_info(PTInstVar pvar, char *dest, int len);
738     void SSH_get_compression_info(PTInstVar pvar, char *dest, int len);
739     void SSH_get_mac_info(PTInstVar pvar, char *dest, int len);
740 maya 3227
741     /* len must be <= SSH_MAX_SEND_PACKET_SIZE */
742     void SSH_channel_send(PTInstVar pvar, int channel_num,
743     uint32 remote_channel_num,
744 doda 6801 unsigned char *buf, int len, int retry);
745 maya 3227 void SSH_fail_channel_open(PTInstVar pvar, uint32 remote_channel_num);
746     void SSH_confirm_channel_open(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
747     void SSH_channel_output_eof(PTInstVar pvar, uint32 remote_channel_num);
748     void SSH_channel_input_eof(PTInstVar pvar, uint32 remote_channel_num, uint32 local_channel_num);
749 doda 6801 void SSH_request_forwarding(PTInstVar pvar, char *bind_address, int from_server_port,
750     char *to_local_host, int to_local_port);
751     void SSH_cancel_request_forwarding(PTInstVar pvar, char *bind_address, int from_server_port, int reply);
752 maya 3227 void SSH_request_X11_forwarding(PTInstVar pvar,
753 doda 6801 char *auth_protocol, unsigned char *auth_data, int auth_data_len, int screen_num);
754 maya 3227 void SSH_open_channel(PTInstVar pvar, uint32 local_channel_num,
755 doda 6801 char *to_remote_host, int to_remote_port,
756     char *originator, unsigned short originator_port);
757 maya 3227
758     int SSH_start_scp(PTInstVar pvar, char *sendfile, char *dstfile);
759     int SSH_start_scp_receive(PTInstVar pvar, char *filename);
760     int SSH_scp_transaction(PTInstVar pvar, char *sendfile, char *dstfile, enum scp_dir direction);
761     int SSH_sftp_transaction(PTInstVar pvar);
762    
763     /* auxiliary SSH2 interfaces for pkt.c */
764 doda 6982 unsigned int SSH_get_min_packet_size(PTInstVar pvar);
765 maya 3227 /* data is guaranteed to be at least SSH_get_min_packet_size bytes long
766     at least 5 bytes must be decrypted */
767 doda 7109 void SSH_predecrypt_packet(PTInstVar pvar, char *data);
768 doda 6982 unsigned int SSH_get_clear_MAC_size(PTInstVar pvar);
769 doda 6985 unsigned int SSH_get_authdata_size(PTInstVar pvar, int direction);
770 maya 3227
771     #define SSH_is_any_payload(pvar) ((pvar)->ssh_state.payload_datalen > 0)
772     #define SSH_get_host_name(pvar) ((pvar)->ssh_state.hostname)
773     #define SSH_get_compression_level(pvar) ((pvar)->ssh_state.compressing ? (pvar)->ts_SSH_CompressionLevel : 0)
774    
775     void SSH2_send_kexinit(PTInstVar pvar);
776     BOOL do_SSH2_userauth(PTInstVar pvar);
777     BOOL do_SSH2_authrequest(PTInstVar pvar);
778     void debug_print(int no, char *msg, int len);
779 doda 7004 int get_cipher_block_size(SSH2Cipher *cipher);
780     int get_cipher_key_len(SSH2Cipher *cipher);
781     int get_cipher_iv_len(SSH2Cipher *cipher);
782     int get_cipher_auth_len(SSH2Cipher *cipher);
783     SSH2Cipher *get_cipher_by_name(char *name);
784 maya 4378 char* get_kex_algorithm_name(kex_algorithm kextype);
785 doda 7004 const EVP_CIPHER* get_cipher_EVP_CIPHER(SSH2Cipher *cipher);
786 maya 4378 const EVP_MD* get_kex_algorithm_EVP_MD(kex_algorithm kextype);
787 doda 7006 SSH2Mac *get_ssh2_mac(SSH2MacId id);
788     char* get_ssh2_mac_name(SSH2Mac *mac);
789     char* get_ssh2_mac_name_by_id(SSH2MacId id);
790     const EVP_MD* get_ssh2_mac_EVP_MD(SSH2Mac *mac);
791     int get_ssh2_mac_truncatebits(SSH2Mac *mac);
792 maya 4378 char* get_ssh2_comp_name(compression_type type);
793     char* get_ssh_keytype_name(ssh_keytype type);
794 maya 6120 char* get_digest_algorithm_name(digest_algorithm id);
795 doda 7004 int get_cipher_discard_len(SSH2Cipher *cipher);
796 maya 3227 void ssh_heartbeat_lock_initialize(void);
797     void ssh_heartbeat_lock_finalize(void);
798     void ssh_heartbeat_lock(void);
799     void ssh_heartbeat_unlock(void);
800     void halt_ssh_heartbeat_thread(PTInstVar pvar);
801     void ssh2_channel_free(void);
802 doda 6657 BOOL handle_SSH2_userauth_msg60(PTInstVar pvar);
803 maya 3227 BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar);
804 doda 6657 BOOL handle_SSH2_userauth_pkok(PTInstVar pvar);
805 yutakapon 4152 BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar);
806 maya 3227 void SSH2_update_compression_myproposal(PTInstVar pvar);
807     void SSH2_update_cipher_myproposal(PTInstVar pvar);
808 yutakapon 4367 void SSH2_update_kex_myproposal(PTInstVar pvar);
809     void SSH2_update_host_key_myproposal(PTInstVar pvar);
810     void SSH2_update_hmac_myproposal(PTInstVar pvar);
811 yutakapon 4106 int SSH_notify_break_signal(PTInstVar pvar);
812 maya 3227
813 yutakapon 4926 ///
814     enum scp_state {
815     SCP_INIT, SCP_TIMESTAMP, SCP_FILEINFO, SCP_DATA, SCP_CLOSING,
816     };
817    
818     typedef struct bufchain {
819     buffer_t *msg;
820     struct bufchain *next;
821     } bufchain_t;
822    
823 yutakapon 6528 typedef struct PacketList {
824     char *buf;
825     unsigned int buflen;
826     struct PacketList *next;
827     } PacketList_t;
828    
829 yutakapon 4926 typedef struct scp {
830     enum scp_dir dir; // transfer direction
831     enum scp_state state; // SCP state
832     char localfile[MAX_PATH]; // local filename
833     char localfilefull[MAX_PATH]; // local filename fullpath
834     char remotefile[MAX_PATH]; // remote filename
835     FILE *localfp; // file pointer for local file
836     struct __stat64 filestat; // file status information
837     HWND progress_window;
838     HANDLE thread;
839     unsigned int thread_id;
840     PTInstVar pvar;
841     // for receiving file
842     long long filetotalsize;
843     long long filercvsize;
844 maya 5607 DWORD filemtime;
845     DWORD fileatime;
846 yutakapon 6528 PacketList_t *pktlist_head;
847     PacketList_t *pktlist_tail;
848 yutakapon 4926 } scp_t;
849    
850     enum sftp_state {
851 yutakapon 4930 SFTP_INIT, SFTP_CONNECTED, SFTP_REALPATH,
852 yutakapon 4926 };
853    
854     typedef struct sftp {
855     enum sftp_state state;
856 yutakapon 4930 HWND console_window;
857 yutakapon 4929 unsigned int transfer_buflen;
858     unsigned int num_requests;
859     unsigned int version;
860     unsigned int msg_id;
861     #define SFTP_EXT_POSIX_RENAME 0x00000001
862     #define SFTP_EXT_STATVFS 0x00000002
863     #define SFTP_EXT_FSTATVFS 0x00000004
864     #define SFTP_EXT_HARDLINK 0x00000008
865     unsigned int exts;
866     unsigned long long limit_kbps;
867     //struct bwlimit bwlimit_in, bwlimit_out;
868 yutakapon 4930 char path[1024];
869 yutakapon 4926 } sftp_t;
870    
871     typedef struct channel {
872     int used;
873     int self_id;
874     int remote_id;
875     unsigned int local_window;
876     unsigned int local_window_max;
877     unsigned int local_consumed;
878     unsigned int local_maxpacket;
879     unsigned int remote_window;
880     unsigned int remote_maxpacket;
881     enum channel_type type;
882     int local_num;
883     bufchain_t *bufchain;
884     scp_t scp;
885     buffer_t *agent_msg;
886     int agent_request_len;
887     sftp_t sftp;
888 maya 5422 #define SSH_CHANNEL_STATE_CLOSE_SENT 0x00000001
889     unsigned int state;
890 yutakapon 4926 } Channel_t;
891    
892 doda 6801 unsigned char *begin_send_packet(PTInstVar pvar, int type, int len);
893 yutakapon 4926 void finish_send_packet_special(PTInstVar pvar, int skip_compress);
894 doda 6801 void SSH2_send_channel_data(PTInstVar pvar, Channel_t *c, unsigned char *buf, unsigned int buflen, int retry);
895 yutakapon 4926
896     #define finish_send_packet(pvar) finish_send_packet_special((pvar), 0)
897     #define get_payload_uint32(pvar, offset) get_uint32_MSBfirst((pvar)->ssh_state.payload + (offset))
898     #define get_uint32(buf) get_uint32_MSBfirst((buf))
899     #define set_uint32(buf, v) set_uint32_MSBfirst((buf), (v))
900     #define get_mpint_len(pvar, offset) ((get_ushort16_MSBfirst((pvar)->ssh_state.payload + (offset)) + 7) >> 3)
901     #define get_ushort16(buf) get_ushort16_MSBfirst((buf))
902     ///
903    
904 doda 5916 /* Global request confirmation callbacks */
905     typedef void global_confirm_cb(PTInstVar pvar, int type, unsigned int seq, void *ctx);
906     void client_register_global_confirm(global_confirm_cb *cb, void *ctx);
907    
908     /* Global request success/failure callbacks */
909     struct global_confirm {
910     global_confirm_cb *cb;
911     void *ctx;
912     int ref_count;
913 yutakapon 5850 };
914    
915 maya 3227 #endif

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