ssh.h 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "puttymem.h"
  4. #include "tree234.h"
  5. #include "network.h"
  6. #include "misc.h"
  7. struct ssh_channel;
  8. /*
  9. * Buffer management constants. There are several of these for
  10. * various different purposes:
  11. *
  12. * - SSH1_BUFFER_LIMIT is the amount of backlog that must build up
  13. * on a local data stream before we throttle the whole SSH
  14. * connection (in SSH-1 only). Throttling the whole connection is
  15. * pretty drastic so we set this high in the hope it won't
  16. * happen very often.
  17. *
  18. * - SSH_MAX_BACKLOG is the amount of backlog that must build up
  19. * on the SSH connection itself before we defensively throttle
  20. * _all_ local data streams. This is pretty drastic too (though
  21. * thankfully unlikely in SSH-2 since the window mechanism should
  22. * ensure that the server never has any need to throttle its end
  23. * of the connection), so we set this high as well.
  24. *
  25. * - OUR_V2_WINSIZE is the default window size we present on SSH-2
  26. * channels.
  27. *
  28. * - OUR_V2_BIGWIN is the window size we advertise for the only
  29. * channel in a simple connection. It must be <= INT_MAX.
  30. *
  31. * - OUR_V2_MAXPKT is the official "maximum packet size" we send
  32. * to the remote side. This actually has nothing to do with the
  33. * size of the _packet_, but is instead a limit on the amount
  34. * of data we're willing to receive in a single SSH2 channel
  35. * data message.
  36. *
  37. * - OUR_V2_PACKETLIMIT is actually the maximum size of SSH
  38. * _packet_ we're prepared to cope with. It must be a multiple
  39. * of the cipher block size, and must be at least 35000.
  40. */
  41. #define SSH1_BUFFER_LIMIT 32768
  42. #define SSH_MAX_BACKLOG 32768
  43. #define OUR_V2_WINSIZE 16384
  44. #define OUR_V2_BIGWIN 0x7fffffff
  45. #define OUR_V2_MAXPKT 0x4000UL
  46. #define OUR_V2_PACKETLIMIT 0x9000UL
  47. typedef struct PacketQueueNode PacketQueueNode;
  48. struct PacketQueueNode {
  49. PacketQueueNode *next, *prev;
  50. size_t formal_size; /* contribution to PacketQueueBase's total_size */
  51. bool on_free_queue; /* is this packet scheduled for freeing? */
  52. };
  53. typedef struct PktIn {
  54. int type;
  55. unsigned long sequence; /* SSH-2 incoming sequence number */
  56. PacketQueueNode qnode; /* for linking this packet on to a queue */
  57. BinarySource_IMPLEMENTATION;
  58. } PktIn;
  59. typedef struct PktOut {
  60. size_t prefix; /* bytes up to and including type field */
  61. size_t length; /* total bytes, including prefix */
  62. int type;
  63. size_t minlen; /* SSH-2: ensure wire length is at least this */
  64. unsigned char *data; /* allocated storage */
  65. size_t maxlen; /* amount of storage allocated for `data' */
  66. /* Extra metadata used in SSH packet logging mode, allowing us to
  67. * log in the packet header line that the packet came from a
  68. * connection-sharing downstream and what if anything unusual was
  69. * done to it. The additional_log_text field is expected to be a
  70. * static string - it will not be freed. */
  71. unsigned downstream_id;
  72. const char *additional_log_text;
  73. PacketQueueNode qnode; /* for linking this packet on to a queue */
  74. BinarySink_IMPLEMENTATION;
  75. } PktOut;
  76. typedef struct PacketQueueBase {
  77. PacketQueueNode end;
  78. size_t total_size; /* sum of all formal_size fields on the queue */
  79. struct IdempotentCallback *ic;
  80. } PacketQueueBase;
  81. typedef struct PktInQueue {
  82. PacketQueueBase pqb;
  83. PktIn *(*after)(PacketQueueBase *, PacketQueueNode *prev, bool pop);
  84. } PktInQueue;
  85. typedef struct PktOutQueue {
  86. PacketQueueBase pqb;
  87. PktOut *(*after)(PacketQueueBase *, PacketQueueNode *prev, bool pop);
  88. } PktOutQueue;
  89. void pq_base_push(PacketQueueBase *pqb, PacketQueueNode *node);
  90. void pq_base_push_front(PacketQueueBase *pqb, PacketQueueNode *node);
  91. void pq_base_concatenate(PacketQueueBase *dest,
  92. PacketQueueBase *q1, PacketQueueBase *q2);
  93. void pq_in_init(PktInQueue *pq);
  94. void pq_out_init(PktOutQueue *pq);
  95. void pq_in_clear(PktInQueue *pq);
  96. void pq_out_clear(PktOutQueue *pq);
  97. #define pq_push(pq, pkt) \
  98. TYPECHECK((pq)->after(&(pq)->pqb, NULL, false) == pkt, \
  99. pq_base_push(&(pq)->pqb, &(pkt)->qnode))
  100. #define pq_push_front(pq, pkt) \
  101. TYPECHECK((pq)->after(&(pq)->pqb, NULL, false) == pkt, \
  102. pq_base_push_front(&(pq)->pqb, &(pkt)->qnode))
  103. #define pq_peek(pq) ((pq)->after(&(pq)->pqb, &(pq)->pqb.end, false))
  104. #define pq_pop(pq) ((pq)->after(&(pq)->pqb, &(pq)->pqb.end, true))
  105. #define pq_concatenate(dst, q1, q2) \
  106. TYPECHECK((q1)->after(&(q1)->pqb, NULL, false) == \
  107. (dst)->after(&(dst)->pqb, NULL, false) && \
  108. (q2)->after(&(q2)->pqb, NULL, false) == \
  109. (dst)->after(&(dst)->pqb, NULL, false), \
  110. pq_base_concatenate(&(dst)->pqb, &(q1)->pqb, &(q2)->pqb))
  111. #define pq_first(pq) pq_peek(pq)
  112. #define pq_next(pq, pkt) ((pq)->after(&(pq)->pqb, &(pkt)->qnode, false))
  113. /*
  114. * Packet type contexts, so that ssh2_pkt_type can correctly decode
  115. * the ambiguous type numbers back into the correct type strings.
  116. */
  117. typedef enum {
  118. SSH2_PKTCTX_NOKEX,
  119. SSH2_PKTCTX_DHGROUP,
  120. SSH2_PKTCTX_DHGEX,
  121. SSH2_PKTCTX_ECDHKEX,
  122. SSH2_PKTCTX_GSSKEX,
  123. SSH2_PKTCTX_RSAKEX
  124. } Pkt_KCtx;
  125. typedef enum {
  126. SSH2_PKTCTX_NOAUTH,
  127. SSH2_PKTCTX_PUBLICKEY,
  128. SSH2_PKTCTX_PASSWORD,
  129. SSH2_PKTCTX_GSSAPI,
  130. SSH2_PKTCTX_KBDINTER
  131. } Pkt_ACtx;
  132. typedef struct PacketLogSettings {
  133. bool omit_passwords, omit_data;
  134. Pkt_KCtx kctx;
  135. Pkt_ACtx actx;
  136. } PacketLogSettings;
  137. #define MAX_BLANKS 4 /* no packet needs more censored sections than this */
  138. int ssh1_censor_packet(
  139. const PacketLogSettings *pls, int type, bool sender_is_client,
  140. ptrlen pkt, logblank_t *blanks);
  141. int ssh2_censor_packet(
  142. const PacketLogSettings *pls, int type, bool sender_is_client,
  143. ptrlen pkt, logblank_t *blanks);
  144. PktOut *ssh_new_packet(void);
  145. void ssh_free_pktout(PktOut *pkt);
  146. Socket *ssh_connection_sharing_init(
  147. const char *host, int port, Conf *conf, LogContext *logctx,
  148. Plug *sshplug, ssh_sharing_state **state);
  149. void ssh_connshare_provide_connlayer(ssh_sharing_state *sharestate,
  150. ConnectionLayer *cl);
  151. bool ssh_share_test_for_upstream(const char *host, int port, Conf *conf);
  152. void share_got_pkt_from_server(ssh_sharing_connstate *ctx, int type,
  153. const void *pkt, int pktlen);
  154. void share_activate(ssh_sharing_state *sharestate,
  155. const char *server_verstring);
  156. void sharestate_free(ssh_sharing_state *state);
  157. int share_ndownstreams(ssh_sharing_state *state);
  158. void ssh_connshare_log(Ssh *ssh, int event, const char *logtext,
  159. const char *ds_err, const char *us_err);
  160. void share_setup_x11_channel(ssh_sharing_connstate *cs, share_channel *chan,
  161. unsigned upstream_id, unsigned server_id,
  162. unsigned server_currwin, unsigned server_maxpkt,
  163. unsigned client_adjusted_window,
  164. const char *peer_addr, int peer_port, int endian,
  165. int protomajor, int protominor,
  166. const void *initial_data, int initial_len);
  167. /* Per-application overrides for what roles we can take in connection
  168. * sharing, regardless of user configuration (e.g. pscp will never be
  169. * an upstream) */
  170. extern const bool share_can_be_downstream;
  171. extern const bool share_can_be_upstream;
  172. struct X11Display;
  173. struct X11FakeAuth;
  174. /* Structure definition centralised here because the SSH-1 and SSH-2
  175. * connection layers both use it. But the client module (portfwd.c)
  176. * should not try to look inside here. */
  177. struct ssh_rportfwd {
  178. unsigned sport, dport;
  179. char *shost, *dhost;
  180. int addressfamily;
  181. char *log_description; /* name of remote listening port, for logging */
  182. ssh_sharing_connstate *share_ctx;
  183. PortFwdRecord *pfr;
  184. };
  185. void free_rportfwd(struct ssh_rportfwd *rpf);
  186. struct ConnectionLayerVtable {
  187. /* Allocate and free remote-to-local port forwardings, called by
  188. * PortFwdManager or by connection sharing */
  189. struct ssh_rportfwd *(*rportfwd_alloc)(
  190. ConnectionLayer *cl,
  191. const char *shost, int sport, const char *dhost, int dport,
  192. int addressfamily, const char *log_description, PortFwdRecord *pfr,
  193. ssh_sharing_connstate *share_ctx);
  194. void (*rportfwd_remove)(ConnectionLayer *cl, struct ssh_rportfwd *rpf);
  195. /* Open a local-to-remote port forwarding channel, called by
  196. * PortFwdManager */
  197. SshChannel *(*lportfwd_open)(
  198. ConnectionLayer *cl, const char *hostname, int port,
  199. const char *description, const SocketPeerInfo *peerinfo,
  200. Channel *chan);
  201. /* Initiate opening of a 'session'-type channel */
  202. SshChannel *(*session_open)(ConnectionLayer *cl, Channel *chan);
  203. /* Open outgoing channels for X and agent forwarding. (Used in the
  204. * SSH server.) */
  205. SshChannel *(*serverside_x11_open)(ConnectionLayer *cl, Channel *chan,
  206. const SocketPeerInfo *pi);
  207. SshChannel *(*serverside_agent_open)(ConnectionLayer *cl, Channel *chan);
  208. /* Add an X11 display for ordinary X forwarding */
  209. struct X11FakeAuth *(*add_x11_display)(
  210. ConnectionLayer *cl, int authtype, struct X11Display *x11disp);
  211. /* Add and remove X11 displays for connection sharing downstreams */
  212. struct X11FakeAuth *(*add_sharing_x11_display)(
  213. ConnectionLayer *cl, int authtype, ssh_sharing_connstate *share_cs,
  214. share_channel *share_chan);
  215. void (*remove_sharing_x11_display)(
  216. ConnectionLayer *cl, struct X11FakeAuth *auth);
  217. /* Pass through an outgoing SSH packet from a downstream */
  218. void (*send_packet_from_downstream)(
  219. ConnectionLayer *cl, unsigned id, int type,
  220. const void *pkt, int pktlen, const char *additional_log_text);
  221. /* Allocate/free an upstream channel number associated with a
  222. * sharing downstream */
  223. unsigned (*alloc_sharing_channel)(ConnectionLayer *cl,
  224. ssh_sharing_connstate *connstate);
  225. void (*delete_sharing_channel)(ConnectionLayer *cl, unsigned localid);
  226. /* Indicate that a downstream has sent a global request with the
  227. * want-reply flag, so that when a reply arrives it will be passed
  228. * back to that downstrean */
  229. void (*sharing_queue_global_request)(
  230. ConnectionLayer *cl, ssh_sharing_connstate *connstate);
  231. /* Indicate that the last downstream has disconnected */
  232. void (*sharing_no_more_downstreams)(ConnectionLayer *cl);
  233. /* Query whether the connection layer is doing agent forwarding */
  234. bool (*agent_forwarding_permitted)(ConnectionLayer *cl);
  235. /* Set the size of the main terminal window (if any) */
  236. void (*terminal_size)(ConnectionLayer *cl, int width, int height);
  237. /* Indicate that the backlog on standard output has cleared */
  238. void (*stdout_unthrottle)(ConnectionLayer *cl, size_t bufsize);
  239. /* Query the size of the backlog on standard _input_ */
  240. size_t (*stdin_backlog)(ConnectionLayer *cl);
  241. /* Tell the connection layer that the SSH connection itself has
  242. * backed up, so it should tell all currently open channels to
  243. * cease reading from their local input sources if they can. (Or
  244. * tell it that that state of affairs has gone away again.) */
  245. void (*throttle_all_channels)(ConnectionLayer *cl, bool throttled);
  246. /* Ask the connection layer about its current preference for
  247. * line-discipline options. */
  248. bool (*ldisc_option)(ConnectionLayer *cl, int option);
  249. /* Communicate _to_ the connection layer (from the main session
  250. * channel) what its preference for line-discipline options is. */
  251. void (*set_ldisc_option)(ConnectionLayer *cl, int option, bool value);
  252. /* Communicate to the connection layer whether X and agent
  253. * forwarding were successfully enabled (for purposes of
  254. * knowing whether to accept subsequent channel-opens). */
  255. void (*enable_x_fwd)(ConnectionLayer *cl);
  256. void (*enable_agent_fwd)(ConnectionLayer *cl);
  257. /* Communicate to the connection layer whether the main session
  258. * channel currently wants user input. */
  259. void (*set_wants_user_input)(ConnectionLayer *cl, bool wanted);
  260. };
  261. struct ConnectionLayer {
  262. LogContext *logctx;
  263. const struct ConnectionLayerVtable *vt;
  264. };
  265. static inline struct ssh_rportfwd *ssh_rportfwd_alloc(
  266. ConnectionLayer *cl, const char *sh, int sp, const char *dh, int dp,
  267. int af, const char *log, PortFwdRecord *pfr, ssh_sharing_connstate *cs)
  268. { return cl->vt->rportfwd_alloc(cl, sh, sp, dh, dp, af, log, pfr, cs); }
  269. static inline void ssh_rportfwd_remove(
  270. ConnectionLayer *cl, struct ssh_rportfwd *rpf)
  271. { cl->vt->rportfwd_remove(cl, rpf); }
  272. static inline SshChannel *ssh_lportfwd_open(
  273. ConnectionLayer *cl, const char *host, int port,
  274. const char *desc, const SocketPeerInfo *pi, Channel *chan)
  275. { return cl->vt->lportfwd_open(cl, host, port, desc, pi, chan); }
  276. static inline SshChannel *ssh_session_open(ConnectionLayer *cl, Channel *chan)
  277. { return cl->vt->session_open(cl, chan); }
  278. static inline SshChannel *ssh_serverside_x11_open(
  279. ConnectionLayer *cl, Channel *chan, const SocketPeerInfo *pi)
  280. { return cl->vt->serverside_x11_open(cl, chan, pi); }
  281. static inline SshChannel *ssh_serverside_agent_open(
  282. ConnectionLayer *cl, Channel *chan)
  283. { return cl->vt->serverside_agent_open(cl, chan); }
  284. static inline struct X11FakeAuth *ssh_add_x11_display(
  285. ConnectionLayer *cl, int authtype, struct X11Display *x11disp)
  286. { return cl->vt->add_x11_display(cl, authtype, x11disp); }
  287. static inline struct X11FakeAuth *ssh_add_sharing_x11_display(
  288. ConnectionLayer *cl, int authtype, ssh_sharing_connstate *share_cs,
  289. share_channel *share_chan)
  290. { return cl->vt->add_sharing_x11_display(cl, authtype, share_cs, share_chan); }
  291. static inline void ssh_remove_sharing_x11_display(
  292. ConnectionLayer *cl, struct X11FakeAuth *auth)
  293. { cl->vt->remove_sharing_x11_display(cl, auth); }
  294. static inline void ssh_send_packet_from_downstream(
  295. ConnectionLayer *cl, unsigned id, int type,
  296. const void *pkt, int len, const char *log)
  297. { cl->vt->send_packet_from_downstream(cl, id, type, pkt, len, log); }
  298. static inline unsigned ssh_alloc_sharing_channel(
  299. ConnectionLayer *cl, ssh_sharing_connstate *connstate)
  300. { return cl->vt->alloc_sharing_channel(cl, connstate); }
  301. static inline void ssh_delete_sharing_channel(
  302. ConnectionLayer *cl, unsigned localid)
  303. { cl->vt->delete_sharing_channel(cl, localid); }
  304. static inline void ssh_sharing_queue_global_request(
  305. ConnectionLayer *cl, ssh_sharing_connstate *connstate)
  306. { cl->vt->sharing_queue_global_request(cl, connstate); }
  307. static inline void ssh_sharing_no_more_downstreams(ConnectionLayer *cl)
  308. { cl->vt->sharing_no_more_downstreams(cl); }
  309. static inline bool ssh_agent_forwarding_permitted(ConnectionLayer *cl)
  310. { return cl->vt->agent_forwarding_permitted(cl); }
  311. static inline void ssh_terminal_size(ConnectionLayer *cl, int w, int h)
  312. { cl->vt->terminal_size(cl, w, h); }
  313. static inline void ssh_stdout_unthrottle(ConnectionLayer *cl, size_t bufsize)
  314. { cl->vt->stdout_unthrottle(cl, bufsize); }
  315. static inline size_t ssh_stdin_backlog(ConnectionLayer *cl)
  316. { return cl->vt->stdin_backlog(cl); }
  317. static inline void ssh_throttle_all_channels(ConnectionLayer *cl, bool thr)
  318. { cl->vt->throttle_all_channels(cl, thr); }
  319. static inline bool ssh_ldisc_option(ConnectionLayer *cl, int option)
  320. { return cl->vt->ldisc_option(cl, option); }
  321. static inline void ssh_set_ldisc_option(ConnectionLayer *cl, int opt, bool val)
  322. { cl->vt->set_ldisc_option(cl, opt, val); }
  323. static inline void ssh_enable_x_fwd(ConnectionLayer *cl)
  324. { cl->vt->enable_x_fwd(cl); }
  325. static inline void ssh_enable_agent_fwd(ConnectionLayer *cl)
  326. { cl->vt->enable_agent_fwd(cl); }
  327. static inline void ssh_set_wants_user_input(ConnectionLayer *cl, bool wanted)
  328. { cl->vt->set_wants_user_input(cl, wanted); }
  329. /* Exports from portfwd.c */
  330. PortFwdManager *portfwdmgr_new(ConnectionLayer *cl);
  331. void portfwdmgr_free(PortFwdManager *mgr);
  332. void portfwdmgr_config(PortFwdManager *mgr, Conf *conf);
  333. void portfwdmgr_close(PortFwdManager *mgr, PortFwdRecord *pfr);
  334. void portfwdmgr_close_all(PortFwdManager *mgr);
  335. char *portfwdmgr_connect(PortFwdManager *mgr, Channel **chan_ret,
  336. char *hostname, int port, SshChannel *c,
  337. int addressfamily);
  338. bool portfwdmgr_listen(PortFwdManager *mgr, const char *host, int port,
  339. const char *keyhost, int keyport, Conf *conf);
  340. bool portfwdmgr_unlisten(PortFwdManager *mgr, const char *host, int port);
  341. Channel *portfwd_raw_new(ConnectionLayer *cl, Plug **plug);
  342. void portfwd_raw_free(Channel *pfchan);
  343. void portfwd_raw_setup(Channel *pfchan, Socket *s, SshChannel *sc);
  344. Socket *platform_make_agent_socket(Plug *plug, const char *dirprefix,
  345. char **error, char **name);
  346. LogContext *ssh_get_logctx(Ssh *ssh);
  347. /* Communications back to ssh.c from connection layers */
  348. void ssh_throttle_conn(Ssh *ssh, int adjust);
  349. void ssh_got_exitcode(Ssh *ssh, int status);
  350. void ssh_ldisc_update(Ssh *ssh);
  351. void ssh_got_fallback_cmd(Ssh *ssh);
  352. /* Communications back to ssh.c from the BPP */
  353. void ssh_conn_processed_data(Ssh *ssh);
  354. void ssh_check_frozen(Ssh *ssh);
  355. /* Functions to abort the connection, for various reasons. */
  356. void ssh_remote_error(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  357. void ssh_remote_eof(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  358. void ssh_proto_error(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  359. void ssh_sw_abort(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  360. void ssh_sw_abort_deferred(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  361. void ssh_user_close(Ssh *ssh, const char *fmt, ...) PRINTF_LIKE(2, 3);
  362. /* Bit positions in the SSH-1 cipher protocol word */
  363. #define SSH1_CIPHER_IDEA 1
  364. #define SSH1_CIPHER_DES 2
  365. #define SSH1_CIPHER_3DES 3
  366. #define SSH1_CIPHER_BLOWFISH 6
  367. /* The subset of those that we support, with names for selecting them
  368. * on Uppity's command line */
  369. #define SSH1_SUPPORTED_CIPHER_LIST(X) \
  370. X(SSH1_CIPHER_3DES, "3des") \
  371. X(SSH1_CIPHER_BLOWFISH, "blowfish") \
  372. X(SSH1_CIPHER_DES, "des") \
  373. /* end of list */
  374. #define SSH1_CIPHER_LIST_MAKE_MASK(bitpos, name) | (1U << bitpos)
  375. #define SSH1_SUPPORTED_CIPHER_MASK \
  376. (0 SSH1_SUPPORTED_CIPHER_LIST(SSH1_CIPHER_LIST_MAKE_MASK))
  377. struct ssh_key {
  378. const ssh_keyalg *vt;
  379. };
  380. struct RSAKey {
  381. int bits;
  382. int bytes;
  383. mp_int *modulus;
  384. mp_int *exponent;
  385. mp_int *private_exponent;
  386. mp_int *p;
  387. mp_int *q;
  388. mp_int *iqmp;
  389. char *comment;
  390. ssh_key sshk;
  391. };
  392. struct dss_key {
  393. mp_int *p, *q, *g, *y, *x;
  394. ssh_key sshk;
  395. };
  396. struct ec_curve;
  397. /* Weierstrass form curve */
  398. struct ec_wcurve
  399. {
  400. WeierstrassCurve *wc;
  401. WeierstrassPoint *G;
  402. mp_int *G_order;
  403. };
  404. /* Montgomery form curve */
  405. struct ec_mcurve
  406. {
  407. MontgomeryCurve *mc;
  408. MontgomeryPoint *G;
  409. unsigned log2_cofactor;
  410. };
  411. /* Edwards form curve */
  412. struct ec_ecurve
  413. {
  414. EdwardsCurve *ec;
  415. EdwardsPoint *G;
  416. mp_int *G_order;
  417. };
  418. typedef enum EllipticCurveType {
  419. EC_WEIERSTRASS, EC_MONTGOMERY, EC_EDWARDS
  420. } EllipticCurveType;
  421. struct ec_curve {
  422. EllipticCurveType type;
  423. /* 'name' is the identifier of the curve when it has to appear in
  424. * wire protocol encodings, as it does in e.g. the public key and
  425. * signature formats for NIST curves. Curves which do not format
  426. * their keys or signatures in this way just have name==NULL.
  427. *
  428. * 'textname' is non-NULL for all curves, and is a human-readable
  429. * identification suitable for putting in log messages. */
  430. const char *name, *textname;
  431. size_t fieldBits, fieldBytes;
  432. mp_int *p;
  433. union {
  434. struct ec_wcurve w;
  435. struct ec_mcurve m;
  436. struct ec_ecurve e;
  437. };
  438. };
  439. const ssh_keyalg *ec_alg_by_oid(int len, const void *oid,
  440. const struct ec_curve **curve);
  441. const unsigned char *ec_alg_oid(const ssh_keyalg *alg, int *oidlen);
  442. extern const int ec_nist_curve_lengths[], n_ec_nist_curve_lengths;
  443. bool ec_nist_alg_and_curve_by_bits(int bits,
  444. const struct ec_curve **curve,
  445. const ssh_keyalg **alg);
  446. bool ec_ed_alg_and_curve_by_bits(int bits,
  447. const struct ec_curve **curve,
  448. const ssh_keyalg **alg);
  449. struct ecdsa_key {
  450. const struct ec_curve *curve;
  451. WeierstrassPoint *publicKey;
  452. mp_int *privateKey;
  453. ssh_key sshk;
  454. };
  455. struct eddsa_key {
  456. const struct ec_curve *curve;
  457. EdwardsPoint *publicKey;
  458. mp_int *privateKey;
  459. ssh_key sshk;
  460. };
  461. WeierstrassPoint *ecdsa_public(mp_int *private_key, const ssh_keyalg *alg);
  462. EdwardsPoint *eddsa_public(mp_int *private_key, const ssh_keyalg *alg);
  463. /*
  464. * SSH-1 never quite decided which order to store the two components
  465. * of an RSA key. During connection setup, the server sends its host
  466. * and server keys with the exponent first; private key files store
  467. * the modulus first. The agent protocol is even more confusing,
  468. * because the client specifies a key to the server in one order and
  469. * the server lists the keys it knows about in the other order!
  470. */
  471. typedef enum { RSA_SSH1_EXPONENT_FIRST, RSA_SSH1_MODULUS_FIRST } RsaSsh1Order;
  472. void BinarySource_get_rsa_ssh1_pub(
  473. BinarySource *src, RSAKey *result, RsaSsh1Order order);
  474. void BinarySource_get_rsa_ssh1_priv(
  475. BinarySource *src, RSAKey *rsa);
  476. RSAKey *BinarySource_get_rsa_ssh1_priv_agent(BinarySource *src);
  477. bool rsa_ssh1_encrypt(unsigned char *data, int length, RSAKey *key);
  478. mp_int *rsa_ssh1_decrypt(mp_int *input, RSAKey *key);
  479. bool rsa_ssh1_decrypt_pkcs1(mp_int *input, RSAKey *key, strbuf *outbuf);
  480. char *rsastr_fmt(RSAKey *key);
  481. char *rsa_ssh1_fingerprint(RSAKey *key);
  482. bool rsa_verify(RSAKey *key);
  483. void rsa_ssh1_public_blob(BinarySink *bs, RSAKey *key, RsaSsh1Order order);
  484. int rsa_ssh1_public_blob_len(ptrlen data);
  485. void freersapriv(RSAKey *key);
  486. void freersakey(RSAKey *key);
  487. uint32_t crc32_rfc1662(ptrlen data);
  488. uint32_t crc32_ssh1(ptrlen data);
  489. uint32_t crc32_update(uint32_t crc_input, ptrlen data);
  490. /* SSH CRC compensation attack detector */
  491. struct crcda_ctx;
  492. struct crcda_ctx *crcda_make_context(void);
  493. void crcda_free_context(struct crcda_ctx *ctx);
  494. bool detect_attack(struct crcda_ctx *ctx,
  495. const unsigned char *buf, uint32_t len,
  496. const unsigned char *IV);
  497. /*
  498. * SSH2 RSA key exchange functions
  499. */
  500. struct ssh_rsa_kex_extra {
  501. int minklen;
  502. };
  503. RSAKey *ssh_rsakex_newkey(ptrlen data);
  504. void ssh_rsakex_freekey(RSAKey *key);
  505. int ssh_rsakex_klen(RSAKey *key);
  506. strbuf *ssh_rsakex_encrypt(
  507. RSAKey *key, const ssh_hashalg *h, ptrlen plaintext);
  508. mp_int *ssh_rsakex_decrypt(
  509. RSAKey *key, const ssh_hashalg *h, ptrlen ciphertext);
  510. /*
  511. * SSH2 ECDH key exchange functions
  512. */
  513. const char *ssh_ecdhkex_curve_textname(const ssh_kex *kex);
  514. ecdh_key *ssh_ecdhkex_newkey(const ssh_kex *kex);
  515. void ssh_ecdhkex_freekey(ecdh_key *key);
  516. void ssh_ecdhkex_getpublic(ecdh_key *key, BinarySink *bs);
  517. mp_int *ssh_ecdhkex_getkey(ecdh_key *key, ptrlen remoteKey);
  518. /*
  519. * Helper function for k generation in DSA, reused in ECDSA
  520. */
  521. mp_int *dss_gen_k(const char *id_string,
  522. mp_int *modulus, mp_int *private_key,
  523. unsigned char *digest, int digest_len);
  524. struct ssh_cipher {
  525. const ssh_cipheralg *vt;
  526. };
  527. struct ssh_cipheralg {
  528. ssh_cipher *(*new)(const ssh_cipheralg *alg);
  529. void (*free)(ssh_cipher *);
  530. void (*setiv)(ssh_cipher *, const void *iv);
  531. void (*setkey)(ssh_cipher *, const void *key);
  532. void (*encrypt)(ssh_cipher *, void *blk, int len);
  533. void (*decrypt)(ssh_cipher *, void *blk, int len);
  534. /* Ignored unless SSH_CIPHER_SEPARATE_LENGTH flag set */
  535. void (*encrypt_length)(ssh_cipher *, void *blk, int len,
  536. unsigned long seq);
  537. void (*decrypt_length)(ssh_cipher *, void *blk, int len,
  538. unsigned long seq);
  539. const char *ssh2_id;
  540. int blksize;
  541. /* real_keybits is the number of bits of entropy genuinely used by
  542. * the cipher scheme; it's used for deciding how big a
  543. * Diffie-Hellman group is needed to exchange a key for the
  544. * cipher. */
  545. int real_keybits;
  546. /* padded_keybytes is the number of bytes of key data expected as
  547. * input to the setkey function; it's used for deciding how much
  548. * data needs to be generated from the post-kex generation of key
  549. * material. In a sensible cipher which uses all its key bytes for
  550. * real work, this will just be real_keybits/8, but in DES-type
  551. * ciphers which ignore one bit in each byte, it'll be slightly
  552. * different. */
  553. int padded_keybytes;
  554. unsigned int flags;
  555. #define SSH_CIPHER_IS_CBC 1
  556. #define SSH_CIPHER_SEPARATE_LENGTH 2
  557. const char *text_name;
  558. /* If set, this takes priority over other MAC. */
  559. const ssh2_macalg *required_mac;
  560. /* Pointer to any extra data used by a particular implementation. */
  561. const void *extra;
  562. };
  563. static inline ssh_cipher *ssh_cipher_new(const ssh_cipheralg *alg)
  564. { return alg->new(alg); }
  565. static inline void ssh_cipher_free(ssh_cipher *c)
  566. { c->vt->free(c); }
  567. static inline void ssh_cipher_setiv(ssh_cipher *c, const void *iv)
  568. { c->vt->setiv(c, iv); }
  569. static inline void ssh_cipher_setkey(ssh_cipher *c, const void *key)
  570. { c->vt->setkey(c, key); }
  571. static inline void ssh_cipher_encrypt(ssh_cipher *c, void *blk, int len)
  572. { c->vt->encrypt(c, blk, len); }
  573. static inline void ssh_cipher_decrypt(ssh_cipher *c, void *blk, int len)
  574. { c->vt->decrypt(c, blk, len); }
  575. static inline void ssh_cipher_encrypt_length(
  576. ssh_cipher *c, void *blk, int len, unsigned long seq)
  577. { c->vt->encrypt_length(c, blk, len, seq); }
  578. static inline void ssh_cipher_decrypt_length(
  579. ssh_cipher *c, void *blk, int len, unsigned long seq)
  580. { c->vt->decrypt_length(c, blk, len, seq); }
  581. static inline const struct ssh_cipheralg *ssh_cipher_alg(ssh_cipher *c)
  582. { return c->vt; }
  583. struct ssh2_ciphers {
  584. int nciphers;
  585. const ssh_cipheralg *const *list;
  586. };
  587. struct ssh2_mac {
  588. const ssh2_macalg *vt;
  589. BinarySink_DELEGATE_IMPLEMENTATION;
  590. };
  591. struct ssh2_macalg {
  592. /* Passes in the cipher context */
  593. ssh2_mac *(*new)(const ssh2_macalg *alg, ssh_cipher *cipher);
  594. void (*free)(ssh2_mac *);
  595. void (*setkey)(ssh2_mac *, ptrlen key);
  596. void (*start)(ssh2_mac *);
  597. void (*genresult)(ssh2_mac *, unsigned char *);
  598. const char *(*text_name)(ssh2_mac *);
  599. const char *name, *etm_name;
  600. int len, keylen;
  601. /* Pointer to any extra data used by a particular implementation. */
  602. const void *extra;
  603. };
  604. static inline ssh2_mac *ssh2_mac_new(
  605. const ssh2_macalg *alg, ssh_cipher *cipher)
  606. { return alg->new(alg, cipher); }
  607. static inline void ssh2_mac_free(ssh2_mac *m)
  608. { m->vt->free(m); }
  609. static inline void ssh2_mac_setkey(ssh2_mac *m, ptrlen key)
  610. { m->vt->setkey(m, key); }
  611. static inline void ssh2_mac_start(ssh2_mac *m)
  612. { m->vt->start(m); }
  613. static inline void ssh2_mac_genresult(ssh2_mac *m, unsigned char *out)
  614. { m->vt->genresult(m, out); }
  615. static inline const char *ssh2_mac_text_name(ssh2_mac *m)
  616. { return m->vt->text_name(m); }
  617. static inline const ssh2_macalg *ssh2_mac_alg(ssh2_mac *m)
  618. { return m->vt; }
  619. /* Centralised 'methods' for ssh2_mac, defined in sshmac.c. These run
  620. * the MAC in a specifically SSH-2 style, i.e. taking account of a
  621. * packet sequence number as well as the data to be authenticated. */
  622. bool ssh2_mac_verresult(ssh2_mac *, const void *);
  623. void ssh2_mac_generate(ssh2_mac *, void *, int, unsigned long seq);
  624. bool ssh2_mac_verify(ssh2_mac *, const void *, int, unsigned long seq);
  625. /* Use a MAC in its raw form, outside SSH-2 context, to MAC a given
  626. * string with a given key in the most obvious way. */
  627. void mac_simple(const ssh2_macalg *alg, ptrlen key, ptrlen data, void *output);
  628. struct ssh_hash {
  629. const ssh_hashalg *vt;
  630. BinarySink_DELEGATE_IMPLEMENTATION;
  631. };
  632. struct ssh_hashalg {
  633. ssh_hash *(*new)(const ssh_hashalg *alg);
  634. ssh_hash *(*copy)(ssh_hash *);
  635. void (*final)(ssh_hash *, unsigned char *); /* ALSO FREES THE ssh_hash! */
  636. void (*free)(ssh_hash *);
  637. int hlen; /* output length in bytes */
  638. int blocklen; /* length of the hash's input block, or 0 for N/A */
  639. const char *text_basename; /* the semantic name of the hash */
  640. const char *annotation; /* extra info, e.g. which of multiple impls */
  641. const char *text_name; /* both combined, e.g. "SHA-n (unaccelerated)" */
  642. };
  643. static inline ssh_hash *ssh_hash_new(const ssh_hashalg *alg)
  644. { return alg->new(alg); }
  645. static inline ssh_hash *ssh_hash_copy(ssh_hash *h)
  646. { return h->vt->copy(h); }
  647. static inline void ssh_hash_final(ssh_hash *h, unsigned char *out)
  648. { h->vt->final(h, out); }
  649. static inline void ssh_hash_free(ssh_hash *h)
  650. { h->vt->free(h); }
  651. static inline const ssh_hashalg *ssh_hash_alg(ssh_hash *h)
  652. { return h->vt; }
  653. /* Handy macros for defining all those text-name fields at once */
  654. #define HASHALG_NAMES_BARE(base) \
  655. base, NULL, base
  656. #define HASHALG_NAMES_ANNOTATED(base, annotation) \
  657. base, annotation, base " (" annotation ")"
  658. void hash_simple(const ssh_hashalg *alg, ptrlen data, void *output);
  659. struct ssh_kex {
  660. const char *name, *groupname;
  661. enum { KEXTYPE_DH, KEXTYPE_RSA, KEXTYPE_ECDH, KEXTYPE_GSS } main_type;
  662. const ssh_hashalg *hash;
  663. const void *extra; /* private to the kex methods */
  664. };
  665. struct ssh_kexes {
  666. int nkexes;
  667. const ssh_kex *const *list;
  668. };
  669. /* Indices of the negotiation strings in the KEXINIT packet */
  670. enum kexlist {
  671. KEXLIST_KEX, KEXLIST_HOSTKEY, KEXLIST_CSCIPHER, KEXLIST_SCCIPHER,
  672. KEXLIST_CSMAC, KEXLIST_SCMAC, KEXLIST_CSCOMP, KEXLIST_SCCOMP,
  673. NKEXLIST
  674. };
  675. struct ssh_keyalg {
  676. /* Constructors that create an ssh_key */
  677. ssh_key *(*new_pub) (const ssh_keyalg *self, ptrlen pub);
  678. ssh_key *(*new_priv) (const ssh_keyalg *self, ptrlen pub, ptrlen priv);
  679. ssh_key *(*new_priv_openssh) (const ssh_keyalg *self, BinarySource *);
  680. /* Methods that operate on an existing ssh_key */
  681. void (*freekey) (ssh_key *key);
  682. char *(*invalid) (ssh_key *key, unsigned flags);
  683. void (*sign) (ssh_key *key, ptrlen data, unsigned flags, BinarySink *);
  684. bool (*verify) (ssh_key *key, ptrlen sig, ptrlen data);
  685. void (*public_blob)(ssh_key *key, BinarySink *);
  686. void (*private_blob)(ssh_key *key, BinarySink *);
  687. void (*openssh_blob) (ssh_key *key, BinarySink *);
  688. char *(*cache_str) (ssh_key *key);
  689. /* 'Class methods' that don't deal with an ssh_key at all */
  690. int (*pubkey_bits) (const ssh_keyalg *self, ptrlen blob);
  691. /* Constant data fields giving information about the key type */
  692. const char *ssh_id; /* string identifier in the SSH protocol */
  693. const char *cache_id; /* identifier used in PuTTY's host key cache */
  694. const void *extra; /* private to the public key methods */
  695. const unsigned supported_flags; /* signature-type flags we understand */
  696. };
  697. static inline ssh_key *ssh_key_new_pub(const ssh_keyalg *self, ptrlen pub)
  698. { return self->new_pub(self, pub); }
  699. static inline ssh_key *ssh_key_new_priv(
  700. const ssh_keyalg *self, ptrlen pub, ptrlen priv)
  701. { return self->new_priv(self, pub, priv); }
  702. static inline ssh_key *ssh_key_new_priv_openssh(
  703. const ssh_keyalg *self, BinarySource *src)
  704. { return self->new_priv_openssh(self, src); }
  705. static inline void ssh_key_free(ssh_key *key)
  706. { key->vt->freekey(key); }
  707. static inline char *ssh_key_invalid(ssh_key *key, unsigned flags)
  708. { return key->vt->invalid(key, flags); }
  709. static inline void ssh_key_sign(
  710. ssh_key *key, ptrlen data, unsigned flags, BinarySink *bs)
  711. { key->vt->sign(key, data, flags, bs); }
  712. static inline bool ssh_key_verify(ssh_key *key, ptrlen sig, ptrlen data)
  713. { return key->vt->verify(key, sig, data); }
  714. static inline void ssh_key_public_blob(ssh_key *key, BinarySink *bs)
  715. { key->vt->public_blob(key, bs); }
  716. static inline void ssh_key_private_blob(ssh_key *key, BinarySink *bs)
  717. { key->vt->private_blob(key, bs); }
  718. static inline void ssh_key_openssh_blob(ssh_key *key, BinarySink *bs)
  719. { key->vt->openssh_blob(key, bs); }
  720. static inline char *ssh_key_cache_str(ssh_key *key)
  721. { return key->vt->cache_str(key); }
  722. static inline int ssh_key_public_bits(const ssh_keyalg *self, ptrlen blob)
  723. { return self->pubkey_bits(self, blob); }
  724. static inline const ssh_keyalg *ssh_key_alg(ssh_key *key)
  725. { return key->vt; }
  726. static inline const char *ssh_key_ssh_id(ssh_key *key)
  727. { return key->vt->ssh_id; }
  728. static inline const char *ssh_key_cache_id(ssh_key *key)
  729. { return key->vt->cache_id; }
  730. /*
  731. * Enumeration of signature flags from draft-miller-ssh-agent-02
  732. */
  733. #define SSH_AGENT_RSA_SHA2_256 2
  734. #define SSH_AGENT_RSA_SHA2_512 4
  735. struct ssh_compressor {
  736. const ssh_compression_alg *vt;
  737. };
  738. struct ssh_decompressor {
  739. const ssh_compression_alg *vt;
  740. };
  741. struct ssh_compression_alg {
  742. const char *name;
  743. /* For [email protected]: if non-NULL, this name will be considered once
  744. * userauth has completed successfully. */
  745. const char *delayed_name;
  746. ssh_compressor *(*compress_new)(void);
  747. void (*compress_free)(ssh_compressor *);
  748. void (*compress)(ssh_compressor *, const unsigned char *block, int len,
  749. unsigned char **outblock, int *outlen,
  750. int minlen);
  751. ssh_decompressor *(*decompress_new)(void);
  752. void (*decompress_free)(ssh_decompressor *);
  753. bool (*decompress)(ssh_decompressor *, const unsigned char *block, int len,
  754. unsigned char **outblock, int *outlen);
  755. const char *text_name;
  756. };
  757. static inline ssh_compressor *ssh_compressor_new(
  758. const ssh_compression_alg *alg)
  759. { return alg->compress_new(); }
  760. static inline ssh_decompressor *ssh_decompressor_new(
  761. const ssh_compression_alg *alg)
  762. { return alg->decompress_new(); }
  763. static inline void ssh_compressor_free(ssh_compressor *c)
  764. { c->vt->compress_free(c); }
  765. static inline void ssh_decompressor_free(ssh_decompressor *d)
  766. { d->vt->decompress_free(d); }
  767. static inline void ssh_compressor_compress(
  768. ssh_compressor *c, const unsigned char *block, int len,
  769. unsigned char **outblock, int *outlen, int minlen)
  770. { c->vt->compress(c, block, len, outblock, outlen, minlen); }
  771. static inline bool ssh_decompressor_decompress(
  772. ssh_decompressor *d, const unsigned char *block, int len,
  773. unsigned char **outblock, int *outlen)
  774. { return d->vt->decompress(d, block, len, outblock, outlen); }
  775. static inline const ssh_compression_alg *ssh_compressor_alg(
  776. ssh_compressor *c)
  777. { return c->vt; }
  778. static inline const ssh_compression_alg *ssh_decompressor_alg(
  779. ssh_decompressor *d)
  780. { return d->vt; }
  781. struct ssh2_userkey {
  782. ssh_key *key; /* the key itself */
  783. char *comment; /* the key comment */
  784. };
  785. /* The maximum length of any hash algorithm. (bytes) */
  786. #define MAX_HASH_LEN (64) /* longest is SHA-512 */
  787. extern const ssh_cipheralg ssh_3des_ssh1;
  788. extern const ssh_cipheralg ssh_blowfish_ssh1;
  789. extern const ssh_cipheralg ssh_3des_ssh2_ctr;
  790. extern const ssh_cipheralg ssh_3des_ssh2;
  791. extern const ssh_cipheralg ssh_des;
  792. extern const ssh_cipheralg ssh_des_sshcom_ssh2;
  793. extern const ssh_cipheralg ssh_aes256_sdctr;
  794. extern const ssh_cipheralg ssh_aes256_sdctr_hw;
  795. extern const ssh_cipheralg ssh_aes256_sdctr_sw;
  796. extern const ssh_cipheralg ssh_aes256_cbc;
  797. extern const ssh_cipheralg ssh_aes256_cbc_hw;
  798. extern const ssh_cipheralg ssh_aes256_cbc_sw;
  799. extern const ssh_cipheralg ssh_aes192_sdctr;
  800. extern const ssh_cipheralg ssh_aes192_sdctr_hw;
  801. extern const ssh_cipheralg ssh_aes192_sdctr_sw;
  802. extern const ssh_cipheralg ssh_aes192_cbc;
  803. extern const ssh_cipheralg ssh_aes192_cbc_hw;
  804. extern const ssh_cipheralg ssh_aes192_cbc_sw;
  805. extern const ssh_cipheralg ssh_aes128_sdctr;
  806. extern const ssh_cipheralg ssh_aes128_sdctr_hw;
  807. extern const ssh_cipheralg ssh_aes128_sdctr_sw;
  808. extern const ssh_cipheralg ssh_aes128_cbc;
  809. extern const ssh_cipheralg ssh_aes128_cbc_hw;
  810. extern const ssh_cipheralg ssh_aes128_cbc_sw;
  811. extern const ssh_cipheralg ssh_blowfish_ssh2_ctr;
  812. extern const ssh_cipheralg ssh_blowfish_ssh2;
  813. extern const ssh_cipheralg ssh_arcfour256_ssh2;
  814. extern const ssh_cipheralg ssh_arcfour128_ssh2;
  815. extern const ssh_cipheralg ssh2_chacha20_poly1305;
  816. extern const ssh2_ciphers ssh2_3des;
  817. extern const ssh2_ciphers ssh2_des;
  818. extern const ssh2_ciphers ssh2_aes;
  819. extern const ssh2_ciphers ssh2_blowfish;
  820. extern const ssh2_ciphers ssh2_arcfour;
  821. extern const ssh2_ciphers ssh2_ccp;
  822. extern const ssh_hashalg ssh_md5;
  823. extern const ssh_hashalg ssh_sha1;
  824. extern const ssh_hashalg ssh_sha1_hw;
  825. extern const ssh_hashalg ssh_sha1_sw;
  826. extern const ssh_hashalg ssh_sha256;
  827. extern const ssh_hashalg ssh_sha256_hw;
  828. extern const ssh_hashalg ssh_sha256_sw;
  829. extern const ssh_hashalg ssh_sha384;
  830. extern const ssh_hashalg ssh_sha512;
  831. extern const ssh_kexes ssh_diffiehellman_group1;
  832. extern const ssh_kexes ssh_diffiehellman_group14;
  833. extern const ssh_kexes ssh_diffiehellman_gex;
  834. extern const ssh_kexes ssh_gssk5_sha1_kex;
  835. extern const ssh_kexes ssh_rsa_kex;
  836. extern const ssh_kex ssh_ec_kex_curve25519;
  837. extern const ssh_kex ssh_ec_kex_nistp256;
  838. extern const ssh_kex ssh_ec_kex_nistp384;
  839. extern const ssh_kex ssh_ec_kex_nistp521;
  840. extern const ssh_kexes ssh_ecdh_kex;
  841. extern const ssh_keyalg ssh_dss;
  842. extern const ssh_keyalg ssh_rsa;
  843. extern const ssh_keyalg ssh_ecdsa_ed25519;
  844. extern const ssh_keyalg ssh_ecdsa_nistp256;
  845. extern const ssh_keyalg ssh_ecdsa_nistp384;
  846. extern const ssh_keyalg ssh_ecdsa_nistp521;
  847. extern const ssh2_macalg ssh_hmac_md5;
  848. extern const ssh2_macalg ssh_hmac_sha1;
  849. extern const ssh2_macalg ssh_hmac_sha1_buggy;
  850. extern const ssh2_macalg ssh_hmac_sha1_96;
  851. extern const ssh2_macalg ssh_hmac_sha1_96_buggy;
  852. extern const ssh2_macalg ssh_hmac_sha256;
  853. extern const ssh2_macalg ssh2_poly1305;
  854. extern const ssh_compression_alg ssh_zlib;
  855. /*
  856. * On some systems, you have to detect hardware crypto acceleration by
  857. * asking the local OS API rather than OS-agnostically asking the CPU
  858. * itself. If so, then this function should be implemented in each
  859. * platform subdirectory.
  860. */
  861. bool platform_aes_hw_available(void);
  862. bool platform_sha256_hw_available(void);
  863. bool platform_sha1_hw_available(void);
  864. /*
  865. * PuTTY version number formatted as an SSH version string.
  866. */
  867. extern const char sshver[];
  868. /*
  869. * Gross hack: pscp will try to start SFTP but fall back to scp1 if
  870. * that fails. This variable is the means by which scp.c can reach
  871. * into the SSH code and find out which one it got.
  872. */
  873. extern bool ssh_fallback_cmd(Backend *backend);
  874. /*
  875. * The PRNG type, defined in sshprng.c. Visible data fields are
  876. * 'savesize', which suggests how many random bytes you should request
  877. * from a particular PRNG instance to write to putty.rnd, and a
  878. * BinarySink implementation which you can use to write seed data in
  879. * between calling prng_seed_{begin,finish}.
  880. */
  881. struct prng {
  882. size_t savesize;
  883. BinarySink_IMPLEMENTATION;
  884. /* (also there's a surrounding implementation struct in sshprng.c) */
  885. };
  886. prng *prng_new(const ssh_hashalg *hashalg);
  887. void prng_free(prng *p);
  888. void prng_seed_begin(prng *p);
  889. void prng_seed_finish(prng *p);
  890. void prng_read(prng *p, void *vout, size_t size);
  891. void prng_add_entropy(prng *p, unsigned source_id, ptrlen data);
  892. size_t prng_seed_bits(prng *p);
  893. /* This function must be implemented by the platform, and returns a
  894. * timer in milliseconds that the PRNG can use to know whether it's
  895. * been reseeded too recently to do it again.
  896. *
  897. * The PRNG system has its own special timing function not because its
  898. * timing needs are unusual in the real applications, but simply so
  899. * that testcrypt can mock it to keep the tests deterministic. */
  900. uint64_t prng_reseed_time_ms(void);
  901. void random_read(void *out, size_t size);
  902. /* Exports from x11fwd.c */
  903. enum {
  904. X11_TRANS_IPV4 = 0, X11_TRANS_IPV6 = 6, X11_TRANS_UNIX = 256
  905. };
  906. struct X11Display {
  907. /* Broken-down components of the display name itself */
  908. bool unixdomain;
  909. char *hostname;
  910. int displaynum;
  911. int screennum;
  912. /* OSX sometimes replaces all the above with a full Unix-socket pathname */
  913. char *unixsocketpath;
  914. /* PuTTY networking SockAddr to connect to the display, and associated
  915. * gubbins */
  916. SockAddr *addr;
  917. int port;
  918. char *realhost;
  919. /* Our local auth details for talking to the real X display. */
  920. int localauthproto;
  921. unsigned char *localauthdata;
  922. int localauthdatalen;
  923. };
  924. struct X11FakeAuth {
  925. /* Auth details we invented for a virtual display on the SSH server. */
  926. int proto;
  927. unsigned char *data;
  928. int datalen;
  929. char *protoname;
  930. char *datastring;
  931. /* The encrypted form of the first block, in XDM-AUTHORIZATION-1.
  932. * Used as part of the key when these structures are organised
  933. * into a tree. See x11_invent_fake_auth for explanation. */
  934. unsigned char *xa1_firstblock;
  935. /*
  936. * Used inside x11fwd.c to remember recently seen
  937. * XDM-AUTHORIZATION-1 strings, to avoid replay attacks.
  938. */
  939. tree234 *xdmseen;
  940. /*
  941. * What to do with an X connection matching this auth data.
  942. */
  943. struct X11Display *disp;
  944. ssh_sharing_connstate *share_cs;
  945. share_channel *share_chan;
  946. };
  947. void *x11_make_greeting(int endian, int protomajor, int protominor,
  948. int auth_proto, const void *auth_data, int auth_len,
  949. const char *peer_ip, int peer_port,
  950. int *outlen);
  951. int x11_authcmp(void *av, void *bv); /* for putting X11FakeAuth in a tree234 */
  952. /*
  953. * x11_setup_display() parses the display variable and fills in an
  954. * X11Display structure. Some remote auth details are invented;
  955. * the supplied authtype parameter configures the preferred
  956. * authorisation protocol to use at the remote end. The local auth
  957. * details are looked up by calling platform_get_x11_auth.
  958. *
  959. * If the returned pointer is NULL, then *error_msg will contain a
  960. * dynamically allocated error message string.
  961. */
  962. extern struct X11Display *x11_setup_display(const char *display, Conf *,
  963. char **error_msg);
  964. void x11_free_display(struct X11Display *disp);
  965. struct X11FakeAuth *x11_invent_fake_auth(tree234 *t, int authtype);
  966. void x11_free_fake_auth(struct X11FakeAuth *auth);
  967. Channel *x11_new_channel(tree234 *authtree, SshChannel *c,
  968. const char *peeraddr, int peerport,
  969. bool connection_sharing_possible);
  970. char *x11_display(const char *display);
  971. /* Platform-dependent X11 functions */
  972. extern void platform_get_x11_auth(struct X11Display *display, Conf *);
  973. /* examine a mostly-filled-in X11Display and fill in localauth* */
  974. extern const bool platform_uses_x11_unix_by_default;
  975. /* choose default X transport in the absence of a specified one */
  976. SockAddr *platform_get_x11_unix_address(const char *path, int displaynum);
  977. /* make up a SockAddr naming the address for displaynum */
  978. char *platform_get_x_display(void);
  979. /* allocated local X display string, if any */
  980. /* Callbacks in x11.c usable _by_ platform X11 functions */
  981. /*
  982. * This function does the job of platform_get_x11_auth, provided
  983. * it is told where to find a normally formatted .Xauthority file:
  984. * it opens that file, parses it to find an auth record which
  985. * matches the display details in "display", and fills in the
  986. * localauth fields.
  987. *
  988. * It is expected that most implementations of
  989. * platform_get_x11_auth() will work by finding their system's
  990. * .Xauthority file, adjusting the display details if necessary
  991. * for local oddities like Unix-domain socket transport, and
  992. * calling this function to do the rest of the work.
  993. */
  994. void x11_get_auth_from_authfile(struct X11Display *display,
  995. const char *authfilename);
  996. void x11_format_auth_for_authfile(
  997. BinarySink *bs, SockAddr *addr, int display_no,
  998. ptrlen authproto, ptrlen authdata);
  999. int x11_identify_auth_proto(ptrlen protoname);
  1000. void *x11_dehexify(ptrlen hex, int *outlen);
  1001. Channel *agentf_new(SshChannel *c);
  1002. bool dh_is_gex(const ssh_kex *kex);
  1003. dh_ctx *dh_setup_group(const ssh_kex *kex);
  1004. dh_ctx *dh_setup_gex(mp_int *pval, mp_int *gval);
  1005. int dh_modulus_bit_size(const dh_ctx *ctx);
  1006. void dh_cleanup(dh_ctx *);
  1007. mp_int *dh_create_e(dh_ctx *, int nbits);
  1008. const char *dh_validate_f(dh_ctx *, mp_int *f);
  1009. mp_int *dh_find_K(dh_ctx *, mp_int *f);
  1010. bool rsa_ssh1_encrypted(const Filename *filename, char **comment);
  1011. int rsa_ssh1_loadpub(const Filename *filename, BinarySink *bs,
  1012. char **commentptr, const char **errorstr);
  1013. int rsa_ssh1_loadkey(const Filename *filename, RSAKey *key,
  1014. const char *passphrase, const char **errorstr);
  1015. bool rsa_ssh1_savekey(const Filename *filename, RSAKey *key, char *passphrase);
  1016. static inline bool is_base64_char(char c)
  1017. {
  1018. return ((c >= '0' && c <= '9') ||
  1019. (c >= 'a' && c <= 'z') ||
  1020. (c >= 'A' && c <= 'Z') ||
  1021. c == '+' || c == '/' || c == '=');
  1022. }
  1023. extern int base64_decode_atom(const char *atom, unsigned char *out);
  1024. extern int base64_lines(int datalen);
  1025. extern void base64_encode_atom(const unsigned char *data, int n, char *out);
  1026. extern void base64_encode(FILE *fp, const unsigned char *data, int datalen,
  1027. int cpl);
  1028. /* ssh2_load_userkey can return this as an error */
  1029. extern ssh2_userkey ssh2_wrong_passphrase;
  1030. #define SSH2_WRONG_PASSPHRASE (&ssh2_wrong_passphrase)
  1031. bool ssh2_userkey_encrypted(const Filename *filename, char **comment);
  1032. ssh2_userkey *ssh2_load_userkey(
  1033. const Filename *filename, const char *passphrase, const char **errorstr);
  1034. bool ssh2_userkey_loadpub(
  1035. const Filename *filename, char **algorithm, BinarySink *bs,
  1036. char **commentptr, const char **errorstr);
  1037. bool ssh2_save_userkey(
  1038. const Filename *filename, ssh2_userkey *key, char *passphrase);
  1039. const ssh_keyalg *find_pubkey_alg(const char *name);
  1040. const ssh_keyalg *find_pubkey_alg_len(ptrlen name);
  1041. enum {
  1042. SSH_KEYTYPE_UNOPENABLE,
  1043. SSH_KEYTYPE_UNKNOWN,
  1044. SSH_KEYTYPE_SSH1, SSH_KEYTYPE_SSH2,
  1045. /*
  1046. * The OpenSSH key types deserve a little explanation. OpenSSH has
  1047. * two physical formats for private key storage: an old PEM-based
  1048. * one largely dictated by their use of OpenSSL and full of ASN.1,
  1049. * and a new one using the same private key formats used over the
  1050. * wire for talking to ssh-agent. The old format can only support
  1051. * a subset of the key types, because it needs redesign for each
  1052. * key type, and after a while they decided to move to the new
  1053. * format so as not to have to do that.
  1054. *
  1055. * On input, key files are identified as either
  1056. * SSH_KEYTYPE_OPENSSH_PEM or SSH_KEYTYPE_OPENSSH_NEW, describing
  1057. * accurately which actual format the keys are stored in.
  1058. *
  1059. * On output, however, we default to following OpenSSH's own
  1060. * policy of writing out PEM-style keys for maximum backwards
  1061. * compatibility if the key type supports it, and otherwise
  1062. * switching to the new format. So the formats you can select for
  1063. * output are SSH_KEYTYPE_OPENSSH_NEW (forcing the new format for
  1064. * any key type), and SSH_KEYTYPE_OPENSSH_AUTO to use the oldest
  1065. * format supported by whatever key type you're writing out.
  1066. *
  1067. * So we have three type codes, but only two of them usable in any
  1068. * given circumstance. An input key file will never be identified
  1069. * as AUTO, only PEM or NEW; key export UIs should not be able to
  1070. * select PEM, only AUTO or NEW.
  1071. */
  1072. SSH_KEYTYPE_OPENSSH_AUTO,
  1073. SSH_KEYTYPE_OPENSSH_PEM,
  1074. SSH_KEYTYPE_OPENSSH_NEW,
  1075. SSH_KEYTYPE_SSHCOM,
  1076. /*
  1077. * Public-key-only formats, which we still want to be able to read
  1078. * for various purposes.
  1079. */
  1080. SSH_KEYTYPE_SSH1_PUBLIC,
  1081. SSH_KEYTYPE_SSH2_PUBLIC_RFC4716,
  1082. SSH_KEYTYPE_SSH2_PUBLIC_OPENSSH
  1083. };
  1084. char *ssh1_pubkey_str(RSAKey *ssh1key);
  1085. void ssh1_write_pubkey(FILE *fp, RSAKey *ssh1key);
  1086. char *ssh2_pubkey_openssh_str(ssh2_userkey *key);
  1087. void ssh2_write_pubkey(FILE *fp, const char *comment,
  1088. const void *v_pub_blob, int pub_len,
  1089. int keytype);
  1090. char *ssh2_fingerprint_blob(ptrlen);
  1091. char *ssh2_fingerprint(ssh_key *key);
  1092. int key_type(const Filename *filename);
  1093. const char *key_type_to_str(int type);
  1094. bool import_possible(int type);
  1095. int import_target_type(int type);
  1096. bool import_encrypted(const Filename *filename, int type, char **comment);
  1097. int import_ssh1(const Filename *filename, int type,
  1098. RSAKey *key, char *passphrase, const char **errmsg_p);
  1099. ssh2_userkey *import_ssh2(const Filename *filename, int type,
  1100. char *passphrase, const char **errmsg_p);
  1101. bool export_ssh1(const Filename *filename, int type,
  1102. RSAKey *key, char *passphrase);
  1103. bool export_ssh2(const Filename *filename, int type,
  1104. ssh2_userkey *key, char *passphrase);
  1105. void des3_decrypt_pubkey(const void *key, void *blk, int len);
  1106. void des3_encrypt_pubkey(const void *key, void *blk, int len);
  1107. void des3_decrypt_pubkey_ossh(const void *key, const void *iv,
  1108. void *blk, int len);
  1109. void des3_encrypt_pubkey_ossh(const void *key, const void *iv,
  1110. void *blk, int len);
  1111. void aes256_encrypt_pubkey(const void *key, void *blk, int len);
  1112. void aes256_decrypt_pubkey(const void *key, void *blk, int len);
  1113. void des_encrypt_xdmauth(const void *key, void *blk, int len);
  1114. void des_decrypt_xdmauth(const void *key, void *blk, int len);
  1115. void openssh_bcrypt(const char *passphrase,
  1116. const unsigned char *salt, int saltbytes,
  1117. int rounds, unsigned char *out, int outbytes);
  1118. /*
  1119. * For progress updates in the key generation utility.
  1120. */
  1121. #define PROGFN_INITIALISE 1
  1122. #define PROGFN_LIN_PHASE 2
  1123. #define PROGFN_EXP_PHASE 3
  1124. #define PROGFN_PHASE_EXTENT 4
  1125. #define PROGFN_READY 5
  1126. #define PROGFN_PROGRESS 6
  1127. typedef void (*progfn_t) (void *param, int action, int phase, int progress);
  1128. int rsa_generate(RSAKey *key, int bits, progfn_t pfn,
  1129. void *pfnparam);
  1130. int dsa_generate(struct dss_key *key, int bits, progfn_t pfn,
  1131. void *pfnparam);
  1132. int ecdsa_generate(struct ecdsa_key *key, int bits, progfn_t pfn,
  1133. void *pfnparam);
  1134. int eddsa_generate(struct eddsa_key *key, int bits, progfn_t pfn,
  1135. void *pfnparam);
  1136. mp_int *primegen(
  1137. int bits, int modulus, int residue, mp_int *factor,
  1138. int phase, progfn_t pfn, void *pfnparam, unsigned firstbits);
  1139. void invent_firstbits(unsigned *one, unsigned *two, unsigned min_separation);
  1140. /*
  1141. * Connection-sharing API provided by platforms. This function must
  1142. * either:
  1143. * - return SHARE_NONE and do nothing
  1144. * - return SHARE_DOWNSTREAM and set *sock to a Socket connected to
  1145. * downplug
  1146. * - return SHARE_UPSTREAM and set *sock to a Socket connected to
  1147. * upplug.
  1148. */
  1149. enum { SHARE_NONE, SHARE_DOWNSTREAM, SHARE_UPSTREAM };
  1150. int platform_ssh_share(const char *name, Conf *conf,
  1151. Plug *downplug, Plug *upplug, Socket **sock,
  1152. char **logtext, char **ds_err, char **us_err,
  1153. bool can_upstream, bool can_downstream);
  1154. void platform_ssh_share_cleanup(const char *name);
  1155. /*
  1156. * List macro defining the SSH-1 message type codes.
  1157. */
  1158. #define SSH1_MESSAGE_TYPES(X, y) \
  1159. X(y, SSH1_MSG_DISCONNECT, 1) \
  1160. X(y, SSH1_SMSG_PUBLIC_KEY, 2) \
  1161. X(y, SSH1_CMSG_SESSION_KEY, 3) \
  1162. X(y, SSH1_CMSG_USER, 4) \
  1163. X(y, SSH1_CMSG_AUTH_RSA, 6) \
  1164. X(y, SSH1_SMSG_AUTH_RSA_CHALLENGE, 7) \
  1165. X(y, SSH1_CMSG_AUTH_RSA_RESPONSE, 8) \
  1166. X(y, SSH1_CMSG_AUTH_PASSWORD, 9) \
  1167. X(y, SSH1_CMSG_REQUEST_PTY, 10) \
  1168. X(y, SSH1_CMSG_WINDOW_SIZE, 11) \
  1169. X(y, SSH1_CMSG_EXEC_SHELL, 12) \
  1170. X(y, SSH1_CMSG_EXEC_CMD, 13) \
  1171. X(y, SSH1_SMSG_SUCCESS, 14) \
  1172. X(y, SSH1_SMSG_FAILURE, 15) \
  1173. X(y, SSH1_CMSG_STDIN_DATA, 16) \
  1174. X(y, SSH1_SMSG_STDOUT_DATA, 17) \
  1175. X(y, SSH1_SMSG_STDERR_DATA, 18) \
  1176. X(y, SSH1_CMSG_EOF, 19) \
  1177. X(y, SSH1_SMSG_EXIT_STATUS, 20) \
  1178. X(y, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, 21) \
  1179. X(y, SSH1_MSG_CHANNEL_OPEN_FAILURE, 22) \
  1180. X(y, SSH1_MSG_CHANNEL_DATA, 23) \
  1181. X(y, SSH1_MSG_CHANNEL_CLOSE, 24) \
  1182. X(y, SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION, 25) \
  1183. X(y, SSH1_SMSG_X11_OPEN, 27) \
  1184. X(y, SSH1_CMSG_PORT_FORWARD_REQUEST, 28) \
  1185. X(y, SSH1_MSG_PORT_OPEN, 29) \
  1186. X(y, SSH1_CMSG_AGENT_REQUEST_FORWARDING, 30) \
  1187. X(y, SSH1_SMSG_AGENT_OPEN, 31) \
  1188. X(y, SSH1_MSG_IGNORE, 32) \
  1189. X(y, SSH1_CMSG_EXIT_CONFIRMATION, 33) \
  1190. X(y, SSH1_CMSG_X11_REQUEST_FORWARDING, 34) \
  1191. X(y, SSH1_CMSG_AUTH_RHOSTS_RSA, 35) \
  1192. X(y, SSH1_MSG_DEBUG, 36) \
  1193. X(y, SSH1_CMSG_REQUEST_COMPRESSION, 37) \
  1194. X(y, SSH1_CMSG_AUTH_TIS, 39) \
  1195. X(y, SSH1_SMSG_AUTH_TIS_CHALLENGE, 40) \
  1196. X(y, SSH1_CMSG_AUTH_TIS_RESPONSE, 41) \
  1197. X(y, SSH1_CMSG_AUTH_CCARD, 70) \
  1198. X(y, SSH1_SMSG_AUTH_CCARD_CHALLENGE, 71) \
  1199. X(y, SSH1_CMSG_AUTH_CCARD_RESPONSE, 72) \
  1200. /* end of list */
  1201. #define SSH1_AUTH_RHOSTS 1 /* 0x1 */
  1202. #define SSH1_AUTH_RSA 2 /* 0x2 */
  1203. #define SSH1_AUTH_PASSWORD 3 /* 0x3 */
  1204. #define SSH1_AUTH_RHOSTS_RSA 4 /* 0x4 */
  1205. #define SSH1_AUTH_TIS 5 /* 0x5 */
  1206. #define SSH1_AUTH_CCARD 16 /* 0x10 */
  1207. #define SSH1_PROTOFLAG_SCREEN_NUMBER 1 /* 0x1 */
  1208. /* Mask for protoflags we will echo back to server if seen */
  1209. #define SSH1_PROTOFLAGS_SUPPORTED 0 /* 0x1 */
  1210. /*
  1211. * List macro defining SSH-2 message type codes. Some of these depend
  1212. * on particular contexts (i.e. a previously negotiated kex or auth
  1213. * method)
  1214. */
  1215. #define SSH2_MESSAGE_TYPES(X, K, A, y) \
  1216. X(y, SSH2_MSG_DISCONNECT, 1) \
  1217. X(y, SSH2_MSG_IGNORE, 2) \
  1218. X(y, SSH2_MSG_UNIMPLEMENTED, 3) \
  1219. X(y, SSH2_MSG_DEBUG, 4) \
  1220. X(y, SSH2_MSG_SERVICE_REQUEST, 5) \
  1221. X(y, SSH2_MSG_SERVICE_ACCEPT, 6) \
  1222. X(y, SSH2_MSG_KEXINIT, 20) \
  1223. X(y, SSH2_MSG_NEWKEYS, 21) \
  1224. K(y, SSH2_MSG_KEXDH_INIT, 30, SSH2_PKTCTX_DHGROUP) \
  1225. K(y, SSH2_MSG_KEXDH_REPLY, 31, SSH2_PKTCTX_DHGROUP) \
  1226. K(y, SSH2_MSG_KEX_DH_GEX_REQUEST_OLD, 30, SSH2_PKTCTX_DHGEX) \
  1227. K(y, SSH2_MSG_KEX_DH_GEX_REQUEST, 34, SSH2_PKTCTX_DHGEX) \
  1228. K(y, SSH2_MSG_KEX_DH_GEX_GROUP, 31, SSH2_PKTCTX_DHGEX) \
  1229. K(y, SSH2_MSG_KEX_DH_GEX_INIT, 32, SSH2_PKTCTX_DHGEX) \
  1230. K(y, SSH2_MSG_KEX_DH_GEX_REPLY, 33, SSH2_PKTCTX_DHGEX) \
  1231. K(y, SSH2_MSG_KEXGSS_INIT, 30, SSH2_PKTCTX_GSSKEX) \
  1232. K(y, SSH2_MSG_KEXGSS_CONTINUE, 31, SSH2_PKTCTX_GSSKEX) \
  1233. K(y, SSH2_MSG_KEXGSS_COMPLETE, 32, SSH2_PKTCTX_GSSKEX) \
  1234. K(y, SSH2_MSG_KEXGSS_HOSTKEY, 33, SSH2_PKTCTX_GSSKEX) \
  1235. K(y, SSH2_MSG_KEXGSS_ERROR, 34, SSH2_PKTCTX_GSSKEX) \
  1236. K(y, SSH2_MSG_KEXGSS_GROUPREQ, 40, SSH2_PKTCTX_GSSKEX) \
  1237. K(y, SSH2_MSG_KEXGSS_GROUP, 41, SSH2_PKTCTX_GSSKEX) \
  1238. K(y, SSH2_MSG_KEXRSA_PUBKEY, 30, SSH2_PKTCTX_RSAKEX) \
  1239. K(y, SSH2_MSG_KEXRSA_SECRET, 31, SSH2_PKTCTX_RSAKEX) \
  1240. K(y, SSH2_MSG_KEXRSA_DONE, 32, SSH2_PKTCTX_RSAKEX) \
  1241. K(y, SSH2_MSG_KEX_ECDH_INIT, 30, SSH2_PKTCTX_ECDHKEX) \
  1242. K(y, SSH2_MSG_KEX_ECDH_REPLY, 31, SSH2_PKTCTX_ECDHKEX) \
  1243. X(y, SSH2_MSG_USERAUTH_REQUEST, 50) \
  1244. X(y, SSH2_MSG_USERAUTH_FAILURE, 51) \
  1245. X(y, SSH2_MSG_USERAUTH_SUCCESS, 52) \
  1246. X(y, SSH2_MSG_USERAUTH_BANNER, 53) \
  1247. A(y, SSH2_MSG_USERAUTH_PK_OK, 60, SSH2_PKTCTX_PUBLICKEY) \
  1248. A(y, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, 60, SSH2_PKTCTX_PASSWORD) \
  1249. A(y, SSH2_MSG_USERAUTH_INFO_REQUEST, 60, SSH2_PKTCTX_KBDINTER) \
  1250. A(y, SSH2_MSG_USERAUTH_INFO_RESPONSE, 61, SSH2_PKTCTX_KBDINTER) \
  1251. A(y, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE, 60, SSH2_PKTCTX_GSSAPI) \
  1252. A(y, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, 61, SSH2_PKTCTX_GSSAPI) \
  1253. A(y, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, 63, SSH2_PKTCTX_GSSAPI) \
  1254. A(y, SSH2_MSG_USERAUTH_GSSAPI_ERROR, 64, SSH2_PKTCTX_GSSAPI) \
  1255. A(y, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, 65, SSH2_PKTCTX_GSSAPI) \
  1256. A(y, SSH2_MSG_USERAUTH_GSSAPI_MIC, 66, SSH2_PKTCTX_GSSAPI) \
  1257. X(y, SSH2_MSG_GLOBAL_REQUEST, 80) \
  1258. X(y, SSH2_MSG_REQUEST_SUCCESS, 81) \
  1259. X(y, SSH2_MSG_REQUEST_FAILURE, 82) \
  1260. X(y, SSH2_MSG_CHANNEL_OPEN, 90) \
  1261. X(y, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, 91) \
  1262. X(y, SSH2_MSG_CHANNEL_OPEN_FAILURE, 92) \
  1263. X(y, SSH2_MSG_CHANNEL_WINDOW_ADJUST, 93) \
  1264. X(y, SSH2_MSG_CHANNEL_DATA, 94) \
  1265. X(y, SSH2_MSG_CHANNEL_EXTENDED_DATA, 95) \
  1266. X(y, SSH2_MSG_CHANNEL_EOF, 96) \
  1267. X(y, SSH2_MSG_CHANNEL_CLOSE, 97) \
  1268. X(y, SSH2_MSG_CHANNEL_REQUEST, 98) \
  1269. X(y, SSH2_MSG_CHANNEL_SUCCESS, 99) \
  1270. X(y, SSH2_MSG_CHANNEL_FAILURE, 100) \
  1271. /* end of list */
  1272. #define DEF_ENUM_UNIVERSAL(y, name, value) name = value,
  1273. #define DEF_ENUM_CONTEXTUAL(y, name, value, context) name = value,
  1274. enum {
  1275. SSH1_MESSAGE_TYPES(DEF_ENUM_UNIVERSAL, y)
  1276. SSH2_MESSAGE_TYPES(DEF_ENUM_UNIVERSAL,
  1277. DEF_ENUM_CONTEXTUAL, DEF_ENUM_CONTEXTUAL, y)
  1278. /* Virtual packet type, for packets too short to even have a type */
  1279. SSH_MSG_NO_TYPE_CODE = 256
  1280. };
  1281. #undef DEF_ENUM_UNIVERSAL
  1282. #undef DEF_ENUM_CONTEXTUAL
  1283. /*
  1284. * SSH-1 agent messages.
  1285. */
  1286. #define SSH1_AGENTC_REQUEST_RSA_IDENTITIES 1
  1287. #define SSH1_AGENT_RSA_IDENTITIES_ANSWER 2
  1288. #define SSH1_AGENTC_RSA_CHALLENGE 3
  1289. #define SSH1_AGENT_RSA_RESPONSE 4
  1290. #define SSH1_AGENTC_ADD_RSA_IDENTITY 7
  1291. #define SSH1_AGENTC_REMOVE_RSA_IDENTITY 8
  1292. #define SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9 /* openssh private? */
  1293. /*
  1294. * Messages common to SSH-1 and OpenSSH's SSH-2.
  1295. */
  1296. #define SSH_AGENT_FAILURE 5
  1297. #define SSH_AGENT_SUCCESS 6
  1298. /*
  1299. * OpenSSH's SSH-2 agent messages.
  1300. */
  1301. #define SSH2_AGENTC_REQUEST_IDENTITIES 11
  1302. #define SSH2_AGENT_IDENTITIES_ANSWER 12
  1303. #define SSH2_AGENTC_SIGN_REQUEST 13
  1304. #define SSH2_AGENT_SIGN_RESPONSE 14
  1305. #define SSH2_AGENTC_ADD_IDENTITY 17
  1306. #define SSH2_AGENTC_REMOVE_IDENTITY 18
  1307. #define SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19
  1308. /*
  1309. * Assorted other SSH-related enumerations.
  1310. */
  1311. #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 /* 0x1 */
  1312. #define SSH2_DISCONNECT_PROTOCOL_ERROR 2 /* 0x2 */
  1313. #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3 /* 0x3 */
  1314. #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4 /* 0x4 */
  1315. #define SSH2_DISCONNECT_MAC_ERROR 5 /* 0x5 */
  1316. #define SSH2_DISCONNECT_COMPRESSION_ERROR 6 /* 0x6 */
  1317. #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7 /* 0x7 */
  1318. #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8 /* 0x8 */
  1319. #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9 /* 0x9 */
  1320. #define SSH2_DISCONNECT_CONNECTION_LOST 10 /* 0xa */
  1321. #define SSH2_DISCONNECT_BY_APPLICATION 11 /* 0xb */
  1322. #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12 /* 0xc */
  1323. #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13 /* 0xd */
  1324. #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14 /* 0xe */
  1325. #define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15 /* 0xf */
  1326. #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1 /* 0x1 */
  1327. #define SSH2_OPEN_CONNECT_FAILED 2 /* 0x2 */
  1328. #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3 /* 0x3 */
  1329. #define SSH2_OPEN_RESOURCE_SHORTAGE 4 /* 0x4 */
  1330. #define SSH2_EXTENDED_DATA_STDERR 1 /* 0x1 */
  1331. enum {
  1332. /* TTY modes with opcodes defined consistently in the SSH specs. */
  1333. #define TTYMODE_CHAR(name, val, index) SSH_TTYMODE_##name = val,
  1334. #define TTYMODE_FLAG(name, val, field, mask) SSH_TTYMODE_##name = val,
  1335. #include "sshttymodes.h"
  1336. #undef TTYMODE_CHAR
  1337. #undef TTYMODE_FLAG
  1338. /* Modes encoded differently between SSH-1 and SSH-2, for which we
  1339. * make up our own dummy opcodes to avoid confusion. */
  1340. TTYMODE_dummy = 255,
  1341. TTYMODE_ISPEED, TTYMODE_OSPEED,
  1342. /* Limiting value that we can use as an array bound below */
  1343. TTYMODE_LIMIT,
  1344. /* The real opcodes for terminal speeds. */
  1345. TTYMODE_ISPEED_SSH1 = 192,
  1346. TTYMODE_OSPEED_SSH1 = 193,
  1347. TTYMODE_ISPEED_SSH2 = 128,
  1348. TTYMODE_OSPEED_SSH2 = 129,
  1349. /* And the opcode that ends a list. */
  1350. TTYMODE_END_OF_LIST = 0
  1351. };
  1352. struct ssh_ttymodes {
  1353. /* A boolean per mode, indicating whether it's set. */
  1354. bool have_mode[TTYMODE_LIMIT];
  1355. /* The actual value for each mode. */
  1356. unsigned mode_val[TTYMODE_LIMIT];
  1357. };
  1358. struct ssh_ttymodes get_ttymodes_from_conf(Seat *seat, Conf *conf);
  1359. struct ssh_ttymodes read_ttymodes_from_packet(
  1360. BinarySource *bs, int ssh_version);
  1361. void write_ttymodes_to_packet(BinarySink *bs, int ssh_version,
  1362. struct ssh_ttymodes modes);
  1363. const char *ssh1_pkt_type(int type);
  1364. const char *ssh2_pkt_type(Pkt_KCtx pkt_kctx, Pkt_ACtx pkt_actx, int type);
  1365. bool ssh2_pkt_type_code_valid(unsigned type);
  1366. /*
  1367. * Need this to warn about support for the original SSH-2 keyfile
  1368. * format.
  1369. */
  1370. void old_keyfile_warning(void);
  1371. /*
  1372. * Flags indicating implementation bugs that we know how to mitigate
  1373. * if we think the other end has them.
  1374. */
  1375. #define SSH_IMPL_BUG_LIST(X) \
  1376. X(BUG_CHOKES_ON_SSH1_IGNORE) \
  1377. X(BUG_SSH2_HMAC) \
  1378. X(BUG_NEEDS_SSH1_PLAIN_PASSWORD) \
  1379. X(BUG_CHOKES_ON_RSA) \
  1380. X(BUG_SSH2_RSA_PADDING) \
  1381. X(BUG_SSH2_DERIVEKEY) \
  1382. X(BUG_SSH2_REKEY) \
  1383. X(BUG_SSH2_PK_SESSIONID) \
  1384. X(BUG_SSH2_MAXPKT) \
  1385. X(BUG_CHOKES_ON_SSH2_IGNORE) \
  1386. X(BUG_CHOKES_ON_WINADJ) \
  1387. X(BUG_SENDS_LATE_REQUEST_REPLY) \
  1388. X(BUG_SSH2_OLDGEX) \
  1389. /* end of list */
  1390. #define TMP_DECLARE_LOG2_ENUM(thing) log2_##thing,
  1391. enum { SSH_IMPL_BUG_LIST(TMP_DECLARE_LOG2_ENUM) };
  1392. #undef TMP_DECLARE_LOG2_ENUM
  1393. #define TMP_DECLARE_REAL_ENUM(thing) thing = 1 << log2_##thing,
  1394. enum { SSH_IMPL_BUG_LIST(TMP_DECLARE_REAL_ENUM) };
  1395. #undef TMP_DECLARE_REAL_ENUM
  1396. /* Shared system for allocating local SSH channel ids. Expects to be
  1397. * passed a tree full of structs that have a field called 'localid' of
  1398. * type unsigned, and will check that! */
  1399. unsigned alloc_channel_id_general(tree234 *channels, size_t localid_offset);
  1400. #define alloc_channel_id(tree, type) \
  1401. TYPECHECK(&((type *)0)->localid == (unsigned *)0, \
  1402. alloc_channel_id_general(tree, offsetof(type, localid)))
  1403. void add_to_commasep(strbuf *buf, const char *data);
  1404. bool get_commasep_word(ptrlen *list, ptrlen *word);
  1405. int verify_ssh_manual_host_key(
  1406. Conf *conf, const char *fingerprint, ssh_key *key);
  1407. typedef struct ssh_transient_hostkey_cache ssh_transient_hostkey_cache;
  1408. ssh_transient_hostkey_cache *ssh_transient_hostkey_cache_new(void);
  1409. void ssh_transient_hostkey_cache_free(ssh_transient_hostkey_cache *thc);
  1410. void ssh_transient_hostkey_cache_add(
  1411. ssh_transient_hostkey_cache *thc, ssh_key *key);
  1412. bool ssh_transient_hostkey_cache_verify(
  1413. ssh_transient_hostkey_cache *thc, ssh_key *key);
  1414. bool ssh_transient_hostkey_cache_has(
  1415. ssh_transient_hostkey_cache *thc, const ssh_keyalg *alg);
  1416. bool ssh_transient_hostkey_cache_non_empty(ssh_transient_hostkey_cache *thc);