]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ssh/ssh.h
kernel: keep segment locked for data2txt
[plan9front.git] / sys / src / cmd / ssh / ssh.h
1 #include <u.h>
2 #include <libc.h>
3 #include <mp.h>
4 #include <auth.h>
5 #include <libsec.h>
6
7 enum            /* internal debugging flags */
8 {
9         DBG=                    1<<0,
10         DBG_CRYPTO=             1<<1,
11         DBG_PACKET=             1<<2,
12         DBG_AUTH=               1<<3,
13         DBG_PROC=               1<<4,
14         DBG_PROTO=              1<<5,
15         DBG_IO=                 1<<6,
16         DBG_SCP=                1<<7,
17 };
18
19 enum            /* protocol packet types */
20 {
21 /* 0 */
22         SSH_MSG_NONE=0,
23         SSH_MSG_DISCONNECT,
24         SSH_SMSG_PUBLIC_KEY,
25         SSH_CMSG_SESSION_KEY,
26         SSH_CMSG_USER,
27         SSH_CMSG_AUTH_RHOSTS,
28         SSH_CMSG_AUTH_RSA,
29         SSH_SMSG_AUTH_RSA_CHALLENGE,
30         SSH_CMSG_AUTH_RSA_RESPONSE,
31         SSH_CMSG_AUTH_PASSWORD,
32
33 /* 10 */
34         SSH_CMSG_REQUEST_PTY,
35         SSH_CMSG_WINDOW_SIZE,
36         SSH_CMSG_EXEC_SHELL,
37         SSH_CMSG_EXEC_CMD,
38         SSH_SMSG_SUCCESS,
39         SSH_SMSG_FAILURE,
40         SSH_CMSG_STDIN_DATA,
41         SSH_SMSG_STDOUT_DATA,
42         SSH_SMSG_STDERR_DATA,
43         SSH_CMSG_EOF,
44
45 /* 20 */
46         SSH_SMSG_EXITSTATUS,
47         SSH_MSG_CHANNEL_OPEN_CONFIRMATION,
48         SSH_MSG_CHANNEL_OPEN_FAILURE,
49         SSH_MSG_CHANNEL_DATA,
50         SSH_MSG_CHANNEL_INPUT_EOF,
51         SSH_MSG_CHANNEL_OUTPUT_CLOSED,
52         SSH_MSG_UNIX_DOMAIN_X11_FORWARDING,     /* obsolete */
53         SSH_SMSG_X11_OPEN,
54         SSH_CMSG_PORT_FORWARD_REQUEST,
55         SSH_MSG_PORT_OPEN,
56
57 /* 30 */
58         SSH_CMSG_AGENT_REQUEST_FORWARDING,
59         SSH_SMSG_AGENT_OPEN,
60         SSH_MSG_IGNORE,
61         SSH_CMSG_EXIT_CONFIRMATION,
62         SSH_CMSG_X11_REQUEST_FORWARDING,
63         SSH_CMSG_AUTH_RHOSTS_RSA,
64         SSH_MSG_DEBUG,
65         SSH_CMSG_REQUEST_COMPRESSION,
66         SSH_CMSG_MAX_PACKET_SIZE,
67         SSH_CMSG_AUTH_TIS,
68
69 /* 40 */
70         SSH_SMSG_AUTH_TIS_CHALLENGE,
71         SSH_CMSG_AUTH_TIS_RESPONSE,
72         SSH_CMSG_AUTH_KERBEROS,
73         SSH_SMSG_AUTH_KERBEROS_RESPONSE,
74         SSH_CMSG_HAVE_KERBEROS_TGT,
75 };
76
77 enum            /* protocol flags */
78 {
79         SSH_PROTOFLAG_SCREEN_NUMBER=1<<0,
80         SSH_PROTOFLAG_HOST_IN_FWD_OPEN=1<<1,
81 };
82
83 enum            /* agent protocol packet types */
84 {
85         SSH_AGENTC_NONE = 0,
86         SSH_AGENTC_REQUEST_RSA_IDENTITIES,
87         SSH_AGENT_RSA_IDENTITIES_ANSWER,
88         SSH_AGENTC_RSA_CHALLENGE,
89         SSH_AGENT_RSA_RESPONSE,
90         SSH_AGENT_FAILURE,
91         SSH_AGENT_SUCCESS,
92         SSH_AGENTC_ADD_RSA_IDENTITY,
93         SSH_AGENTC_REMOVE_RSA_IDENTITY,
94 };
95
96 enum            /* protocol constants */
97 {
98         SSH_MAX_DATA = 256*1024,
99         SSH_MAX_MSG = SSH_MAX_DATA+4,
100
101         SESSKEYLEN = 32,
102         SESSIDLEN = 16,
103         
104         COOKIELEN = 8,
105 };
106
107 enum            /* crypto ids */
108 {
109         SSH_CIPHER_NONE = 0,
110         SSH_CIPHER_IDEA,
111         SSH_CIPHER_DES,
112         SSH_CIPHER_3DES,
113         SSH_CIPHER_TSS,
114         SSH_CIPHER_RC4,
115         SSH_CIPHER_BLOWFISH,
116         SSH_CIPHER_TWIDDLE,             /* for debugging */
117 };
118
119 enum            /* auth method ids */
120 {
121         SSH_AUTH_RHOSTS = 1,
122         SSH_AUTH_RSA = 2,
123         SSH_AUTH_PASSWORD = 3,
124         SSH_AUTH_RHOSTS_RSA = 4,
125         SSH_AUTH_TIS = 5,
126         SSH_AUTH_USER_RSA = 6,
127 };
128
129 typedef struct Auth Auth;
130 typedef struct Authsrv Authsrv;
131 typedef struct Cipher Cipher;
132 typedef struct CipherState CipherState;
133 typedef struct Conn Conn;
134 typedef struct Msg Msg;
135
136 #pragma incomplete CipherState
137
138 struct Auth
139 {
140         int id;
141         char *name;
142         int (*fn)(Conn*);
143 };
144
145 struct Authsrv
146 {
147         int id;
148         char *name;
149         int firstmsg;
150         AuthInfo *(*fn)(Conn*, Msg*);
151 };
152
153 struct Cipher
154 {
155         int id;
156         char *name;
157         CipherState *(*init)(Conn*, int isserver);
158         void (*encrypt)(CipherState*, uchar*, int);
159         void (*decrypt)(CipherState*, uchar*, int);
160 };
161
162 struct Conn
163 {
164         QLock;
165         int fd[2];
166         CipherState *cstate;
167         uchar cookie[COOKIELEN];
168         uchar sessid[SESSIDLEN];
169         uchar sesskey[SESSKEYLEN];
170         RSApub *serverkey;
171         RSApub *hostkey;
172         ulong flags;
173         ulong ciphermask;
174         Cipher *cipher;         /* chosen cipher */
175         Cipher **okcipher;      /* list of acceptable ciphers */
176         int nokcipher;
177         ulong authmask;
178         Auth **okauth;
179         int nokauth;
180         char *user;
181         char *host;
182         char *aliases;
183         int interactive;
184         Msg *unget;
185
186         RSApriv *serverpriv;            /* server only */
187         RSApriv *hostpriv;
188         Authsrv **okauthsrv;
189         int nokauthsrv;
190 };
191
192 struct Msg
193 {
194         Conn *c;
195         uchar type;
196         ulong len;              /* output: #bytes before pos, input: #bytes after pos */
197         uchar *bp;      /* beginning of allocated space */
198         uchar *rp;              /* read pointer */
199         uchar *wp;      /* write pointer */
200         uchar *ep;      /* end of allocated space */
201         Msg *link;              /* for sshnet */
202 };
203
204 #define LONG(p) (((p)[0]<<24)|((p)[1]<<16)|((p)[2]<<8)|((p)[3]))
205 #define PLONG(p, l) \
206         (((p)[0]=(l)>>24),((p)[1]=(l)>>16),\
207          ((p)[2]=(l)>>8),((p)[3]=(l)))
208 #define SHORT(p) (((p)[0]<<8)|(p)[1])
209 #define PSHORT(p,l) \
210         (((p)[0]=(l)>>8),((p)[1]=(l)))
211
212 extern char Edecode[];
213 extern char Eencode[];
214 extern char Ememory[];
215 extern char Ehangup[];
216 extern int doabort;
217 extern int debuglevel;
218
219 extern Auth authpassword;
220 extern Auth authrsa;
221 extern Auth authtis;
222
223 extern Authsrv authsrvpassword;
224 extern Authsrv authsrvtis;
225
226 extern Cipher cipher3des;
227 extern Cipher cipherblowfish;
228 extern Cipher cipherdes;
229 extern Cipher cipherrc4;
230 extern Cipher ciphernone;
231 extern Cipher ciphertwiddle;
232
233 /* msg.c */
234 Msg*    allocmsg(Conn*, int, int);
235 void            badmsg(Msg*, int);
236 Msg*    recvmsg(Conn*, int);
237 void            unrecvmsg(Conn*, Msg*);
238 int             sendmsg(Msg*);
239 uchar   getbyte(Msg*);
240 ushort  getshort(Msg*);
241 ulong   getlong(Msg*);
242 char*   getstring(Msg*);
243 void*   getbytes(Msg*, int);
244 mpint*  getmpint(Msg*);
245 RSApub* getRSApub(Msg*);
246 void            putbyte(Msg*, uchar);
247 void            putshort(Msg*, ushort);
248 void            putlong(Msg*, ulong);
249 void            putstring(Msg*, char*);
250 void            putbytes(Msg*, void*, long);
251 void            putmpint(Msg*, mpint*);
252 void            putRSApub(Msg*, RSApub*);
253 mpint*  rsapad(mpint*, int);
254 mpint*  rsaunpad(mpint*);
255 void            mptoberjust(mpint*, uchar*, int);
256 mpint*  rsaencryptbuf(RSApub*, uchar*, int);
257
258 /* cmsg.c */
259 void            sshclienthandshake(Conn*);
260 void            requestpty(Conn*);
261 int             readgeom(int*, int*, int*, int*);
262 void            sendwindowsize(Conn*, int, int, int, int);
263 int             rawhack;
264
265 /* smsg.c */
266 void            sshserverhandshake(Conn*);
267
268 /* pubkey.c */
269 enum
270 {
271         KeyOk,
272         KeyWrong,
273         NoKey,
274         NoKeyFile,
275 };
276 int             appendkey(char*, char*, RSApub*);
277 int             findkey(char*, char*, RSApub*);
278 int             replacekey(char*, char*, RSApub*);
279
280 /* agent.c */
281 int             startagent(Conn*);
282 void            handleagentmsg(Msg*);
283 void            handleagentopen(Msg*);
284 void            handleagentieof(Msg*);
285 void            handleagentoclose(Msg*);
286
287 /* util.c */
288 void            debug(int, char*, ...);
289 void*   emalloc(long);
290 void*   erealloc(void*, long);
291 void            error(char*, ...);
292 RSApriv*        readsecretkey(char*);
293 int             readstrnl(int, char*, int);
294 void            atexitkill(int);
295 void            atexitkiller(void);
296 void            calcsessid(Conn*);
297 void            sshlog(char*, ...);
298 void            setaliases(Conn*, char*);
299 void            privatefactotum(void);
300
301 #pragma varargck argpos debug 2
302 #pragma varargck argpos error 1
303 #pragma varargck argpos sshlog 2