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

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