1 /*        $NetBSD: telnet.h,v 1.13 2017/01/12 18:42:53 christos Exp $ */
2 
3 /*
4  * Copyright (c) 1983, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
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. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *        @(#)telnet.h        8.2 (Berkeley) 12/15/93
32  */
33 
34 #ifndef _ARPA_TELNET_H_
35 #define   _ARPA_TELNET_H_
36 
37 /*
38  * Definitions for the TELNET protocol.
39  */
40 #define   IAC       255                 /* interpret as command: */
41 #define   DONT      254                 /* you are not to use option */
42 #define   DO        253                 /* please, you use option */
43 #define   WONT      252                 /* I won't use option */
44 #define   WILL      251                 /* I will use option */
45 #define   SB        250                 /* interpret as subnegotiation */
46 #define   GA        249                 /* you may reverse the line */
47 #define   EL        248                 /* erase the current line */
48 #define   EC        247                 /* erase the current character */
49 #define   AYT       246                 /* are you there */
50 #define   AO        245                 /* abort output--but let prog finish */
51 #define   IP        244                 /* interrupt process--permanently */
52 #define   BREAK     243                 /* break */
53 #define   DM        242                 /* data mark--for connect. cleaning */
54 #define   NOP       241                 /* nop */
55 #define   SE        240                 /* end sub negotiation */
56 #define EOR     239             /* end of record (transparent mode) */
57 #define   ABORT     238                 /* Abort process */
58 #define   SUSP      237                 /* Suspend process */
59 #define   xEOF      236                 /* End of file: EOF is already used... */
60 
61 #define SYNCH       242                 /* for telfunc calls */
62 
63 #ifdef TELCMDS
64 const char *telcmds[] = {
65           "EOF", "SUSP", "ABORT", "EOR",
66           "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
67           "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0
68 };
69 #else
70 extern const char *telcmds[];
71 #endif
72 
73 #define   TELCMD_FIRST        xEOF
74 #define   TELCMD_LAST         IAC
75 #define   TELCMD_OK(x)        ((unsigned int)(x) <= TELCMD_LAST && \
76                                (unsigned int)(x) >= TELCMD_FIRST)
77 #define   TELCMD(x) telcmds[(x)-TELCMD_FIRST]
78 
79 /* telnet options */
80 #define TELOPT_BINARY         0         /* 8-bit data path */
81 #define TELOPT_ECHO 1         /* echo */
82 #define   TELOPT_RCP          2         /* prepare to reconnect */
83 #define   TELOPT_SGA          3         /* suppress go ahead */
84 #define   TELOPT_NAMS         4         /* approximate message size */
85 #define   TELOPT_STATUS       5         /* give status */
86 #define   TELOPT_TM 6         /* timing mark */
87 #define   TELOPT_RCTE         7         /* remote controlled transmission and echo */
88 #define TELOPT_NAOL           8         /* negotiate about output line width */
89 #define TELOPT_NAOP           9         /* negotiate about output page size */
90 #define TELOPT_NAOCRD         10        /* negotiate about CR disposition */
91 #define TELOPT_NAOHTS         11        /* negotiate about horizontal tabstops */
92 #define TELOPT_NAOHTD         12        /* negotiate about horizontal tab disposition */
93 #define TELOPT_NAOFFD         13        /* negotiate about formfeed disposition */
94 #define TELOPT_NAOVTS         14        /* negotiate about vertical tab stops */
95 #define TELOPT_NAOVTD         15        /* negotiate about vertical tab disposition */
96 #define TELOPT_NAOLFD         16        /* negotiate about output LF disposition */
97 #define TELOPT_XASCII         17        /* extended ascic character set */
98 #define   TELOPT_LOGOUT       18        /* force logout */
99 #define   TELOPT_BM 19        /* byte macro */
100 #define   TELOPT_DET          20        /* data entry terminal */
101 #define   TELOPT_SUPDUP       21        /* supdup protocol */
102 #define   TELOPT_SUPDUPOUTPUT 22        /* supdup output */
103 #define   TELOPT_SNDLOC       23        /* send location */
104 #define   TELOPT_TTYPE        24        /* terminal type */
105 #define   TELOPT_EOR          25        /* end or record */
106 #define   TELOPT_TUID         26        /* TACACS user identification */
107 #define   TELOPT_OUTMRK       27        /* output marking */
108 #define   TELOPT_TTYLOC       28        /* terminal location number */
109 #define   TELOPT_3270REGIME 29          /* 3270 regime */
110 #define   TELOPT_X3PAD        30        /* X.3 PAD */
111 #define   TELOPT_NAWS         31        /* window size */
112 #define   TELOPT_TSPEED       32        /* terminal speed */
113 #define   TELOPT_LFLOW        33        /* remote flow control */
114 #define TELOPT_LINEMODE       34        /* Linemode option */
115 #define TELOPT_XDISPLOC       35        /* X Display Location */
116 #define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
117 #define   TELOPT_AUTHENTICATION 37/* Authenticate */
118 #define   TELOPT_ENCRYPT      38        /* Encryption option */
119 #define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
120 #define   TELOPT_TN3270E      40        /* RFC2355 - TN3270 Enhancements */
121 #define   TELOPT_CHARSET      42        /* RFC2066 - Charset */
122 #define   TELOPT_COMPORT      44        /* RFC2217 - Com Port Control */
123 #define   TELOPT_KERMIT       47        /* RFC2840 - Kermit */
124 #define   TELOPT_EXOPL        255       /* extended-options-list */
125 
126 
127 #define   TELOPT_FIRST        TELOPT_BINARY
128 #define   TELOPT_LAST         TELOPT_KERMIT
129 #define   TELOPT_OK(x)        ((unsigned int)(x) <= TELOPT_LAST)
130 #define   TELOPT(x) telopts[(x)-TELOPT_FIRST]
131 
132 #define   NTELOPTS  (1+TELOPT_LAST)
133 
134 #ifdef TELOPTS
135 const char *telopts[NTELOPTS+1] = {
136           "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
137           "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
138           "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
139           "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
140           "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
141           "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
142           "TACACS UID", "OUTPUT MARKING", "TTYLOC",
143           "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
144           "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
145           "ENCRYPT", "NEW-ENVIRON", "TN3270E", "CHARSET", "COM-PORT",
146           "KERMIT",
147           0
148 };
149 #else
150 extern const char *telopts[NTELOPTS+1];
151 #endif
152 
153 /* sub-option qualifiers */
154 #define   TELQUAL_IS          0         /* option is... */
155 #define   TELQUAL_SEND        1         /* send option */
156 #define   TELQUAL_INFO        2         /* ENVIRON: informational version of IS */
157 #define   TELQUAL_REPLY       2         /* AUTHENTICATION: client version of IS */
158 #define   TELQUAL_NAME        3         /* AUTHENTICATION: client version of IS */
159 
160 #define   LFLOW_OFF           0         /* Disable remote flow control */
161 #define   LFLOW_ON            1         /* Enable remote flow control */
162 #define   LFLOW_RESTART_ANY   2         /* Restart output on any char */
163 #define   LFLOW_RESTART_XON   3         /* Restart output only on XON */
164 
165 /*
166  * LINEMODE suboptions
167  */
168 
169 #define   LM_MODE             1
170 #define   LM_FORWARDMASK      2
171 #define   LM_SLC              3
172 
173 #define   MODE_EDIT 0x01
174 #define   MODE_TRAPSIG        0x02
175 #define   MODE_ACK  0x04
176 #define MODE_SOFT_TAB         0x08
177 #define MODE_LIT_ECHO         0x10
178 
179 #define   MODE_MASK 0x1f
180 
181 /* Not part of protocol, but needed to simplify things... */
182 #define MODE_FLOW             0x0100
183 #define MODE_ECHO             0x0200
184 #define MODE_INBIN            0x0400
185 #define MODE_OUTBIN           0x0800
186 #define MODE_FORCE            0x1000
187 
188 #define   SLC_SYNCH 1
189 #define   SLC_BRK             2
190 #define   SLC_IP              3
191 #define   SLC_AO              4
192 #define   SLC_AYT             5
193 #define   SLC_EOR             6
194 #define   SLC_ABORT 7
195 #define   SLC_EOF             8
196 #define   SLC_SUSP  9
197 #define   SLC_EC              10
198 #define   SLC_EL              11
199 #define   SLC_EW              12
200 #define   SLC_RP              13
201 #define   SLC_LNEXT 14
202 #define   SLC_XON             15
203 #define   SLC_XOFF  16
204 #define   SLC_FORW1 17
205 #define   SLC_FORW2 18
206 #define   SLC_MCL         19
207 #define   SLC_MCR         20
208 #define   SLC_MCWL        21
209 #define   SLC_MCWR        22
210 #define   SLC_MCBOL       23
211 #define   SLC_MCEOL       24
212 #define   SLC_INSRT       25
213 #define   SLC_OVER        26
214 #define   SLC_ECR         27
215 #define   SLC_EWR         28
216 #define   SLC_EBOL        29
217 #define   SLC_EEOL        30
218 
219 #define   NSLC                30
220 
221 /*
222  * For backwards compatibility, we define SLC_NAMES to be the
223  * list of names if SLC_NAMES is not defined.
224  */
225 #define   SLC_NAMELIST        "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR",    \
226                               "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP",   \
227                               "LNEXT", "XON", "XOFF", "FORW1", "FORW2",         \
228                               "MCL", "MCR", "MCWL", "MCWR", "MCBOL",            \
229                               "MCEOL", "INSRT", "OVER", "ECR", "EWR",           \
230                               "EBOL", "EEOL",                                             \
231                               0
232 
233 #ifdef    SLC_NAMES
234 const char *slc_names[] = {
235           SLC_NAMELIST
236 };
237 #else
238 extern const char *slc_names[];
239 #define   SLC_NAMES SLC_NAMELIST
240 #endif
241 
242 #define   SLC_NAME_OK(x)      ((unsigned int)(x) <= NSLC)
243 #define SLC_NAME(x) slc_names[x]
244 
245 #define   SLC_NOSUPPORT       0
246 #define   SLC_CANTCHANGE      1
247 #define   SLC_VARIABLE        2
248 #define   SLC_DEFAULT         3
249 #define   SLC_LEVELBITS       0x03
250 
251 #define   SLC_FUNC  0
252 #define   SLC_FLAGS 1
253 #define   SLC_VALUE 2
254 
255 #define   SLC_ACK             0x80
256 #define   SLC_FLUSHIN         0x40
257 #define   SLC_FLUSHOUT        0x20
258 
259 #define   OLD_ENV_VAR         1
260 #define   OLD_ENV_VALUE       0
261 #define   NEW_ENV_VAR         0
262 #define   NEW_ENV_VALUE       1
263 #define   ENV_ESC             2
264 #define ENV_USERVAR 3
265 
266 /*
267  * AUTHENTICATION suboptions
268  */
269 
270 /*
271  * Who is authenticating who ...
272  */
273 #define   AUTH_WHO_CLIENT               0         /* Client authenticating server */
274 #define   AUTH_WHO_SERVER               1         /* Server authenticating client */
275 #define   AUTH_WHO_MASK                 1
276 
277 /*
278  * amount of authentication done
279  */
280 #define   AUTH_HOW_ONE_WAY    0
281 #define   AUTH_HOW_MUTUAL               2
282 #define   AUTH_HOW_MASK                 2
283 
284 /*
285  * should we be encrypting? (not yet formally standardized)
286  */
287 #define AUTH_ENCRYPT_OFF      0
288 #define AUTH_ENCRYPT_ON                 4
289 #define AUTH_ENCRYPT_MASK     4
290 
291 #define   AUTHTYPE_NULL                 0
292 #define   AUTHTYPE_KERBEROS_V4          1
293 #define   AUTHTYPE_KERBEROS_V5          2
294 #define   AUTHTYPE_SPX                  3
295 #define   AUTHTYPE_MINK                 4
296 #define   AUTHTYPE_SRA                  6
297 #define   AUTHTYPE_CNT                  7
298 
299 #define   AUTHTYPE_TEST                 99
300 
301 #ifdef    AUTH_NAMES
302 const char *authtype_names[] = {
303           "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", NULL, "SRA",
304           0
305 };
306 #else
307 extern const char *authtype_names[];
308 #endif
309 
310 #define   AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
311 #define   AUTHTYPE_NAME(x)    authtype_names[x]
312 
313 /*
314  * ENCRYPTion suboptions
315  */
316 #define   ENCRYPT_IS                    0         /* I pick encryption type ... */
317 #define   ENCRYPT_SUPPORT               1         /* I support encryption types ... */
318 #define   ENCRYPT_REPLY                 2         /* Initial setup response */
319 #define   ENCRYPT_START                 3         /* Am starting to send encrypted */
320 #define   ENCRYPT_END                   4         /* Am ending encrypted */
321 #define   ENCRYPT_REQSTART    5         /* Request you start encrypting */
322 #define   ENCRYPT_REQEND                6         /* Request you send encrypting */
323 #define   ENCRYPT_ENC_KEYID   7
324 #define   ENCRYPT_DEC_KEYID   8
325 #define   ENCRYPT_CNT                   9
326 
327 #define   ENCTYPE_ANY                   0
328 #define   ENCTYPE_DES_CFB64   1
329 #define   ENCTYPE_DES_OFB64   2
330 #define   ENCTYPE_CNT                   3
331 
332 #ifdef    ENCRYPT_NAMES
333 const char *encrypt_names[] = {
334           "IS", "SUPPORT", "REPLY", "START", "END",
335           "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
336           0
337 };
338 const char *enctype_names[] = {
339           "ANY", "DES_CFB64",  "DES_OFB64",
340           0
341 };
342 #else
343 extern const char *encrypt_names[];
344 extern const char *enctype_names[];
345 #endif
346 
347 
348 #define   ENCRYPT_NAME_OK(x)  ((unsigned int)(x) < ENCRYPT_CNT)
349 #define   ENCRYPT_NAME(x)               encrypt_names[x]
350 
351 #define   ENCTYPE_NAME_OK(x)  ((unsigned int)(x) < ENCTYPE_CNT)
352 #define   ENCTYPE_NAME(x)               enctype_names[x]
353 
354 #endif /* _ARPA_TELNET_H_ */
355