lws-ssh.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. /*
  2. * libwebsockets - small server side websockets and web server implementation
  3. *
  4. * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to
  8. * deal in the Software without restriction, including without limitation the
  9. * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10. * sell copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  22. * IN THE SOFTWARE.
  23. */
  24. #if !defined(__LWS_SSH_H__)
  25. #define __LWS_SSH_H__
  26. #if defined(LWS_WITH_MBEDTLS)
  27. #include "mbedtls/sha1.h"
  28. #include "mbedtls/sha256.h"
  29. #include "mbedtls/sha512.h"
  30. #include "mbedtls/rsa.h"
  31. #endif
  32. #include "lws-plugin-ssh.h"
  33. #define LWS_SIZE_EC25519 32
  34. #define LWS_SIZE_EC25519_PUBKEY 32
  35. #define LWS_SIZE_EC25519_PRIKEY 64
  36. #define LWS_SIZE_SHA256 32
  37. #define LWS_SIZE_SHA512 64
  38. #define LWS_SIZE_AES256_KEY 32
  39. #define LWS_SIZE_AES256_IV 12
  40. #define LWS_SIZE_AES256_MAC 16
  41. #define LWS_SIZE_AES256_BLOCK 16
  42. #define LWS_SIZE_CHACHA256_KEY (2 * 32)
  43. #define POLY1305_TAGLEN 16
  44. #define POLY1305_KEYLEN 32
  45. #define crypto_hash_sha512_BYTES 64U
  46. #define PEEK_U64(p) \
  47. (((uint64_t)(((const uint8_t *)(p))[0]) << 56) | \
  48. ((uint64_t)(((const uint8_t *)(p))[1]) << 48) | \
  49. ((uint64_t)(((const uint8_t *)(p))[2]) << 40) | \
  50. ((uint64_t)(((const uint8_t *)(p))[3]) << 32) | \
  51. ((uint64_t)(((const uint8_t *)(p))[4]) << 24) | \
  52. ((uint64_t)(((const uint8_t *)(p))[5]) << 16) | \
  53. ((uint64_t)(((const uint8_t *)(p))[6]) << 8) | \
  54. (uint64_t)(((const uint8_t *)(p))[7]))
  55. #define PEEK_U32(p) \
  56. (((uint32_t)(((const uint8_t *)(p))[0]) << 24) | \
  57. ((uint32_t)(((const uint8_t *)(p))[1]) << 16) | \
  58. ((uint32_t)(((const uint8_t *)(p))[2]) << 8) | \
  59. (uint32_t)(((const uint8_t *)(p))[3]))
  60. #define PEEK_U16(p) \
  61. (((uint16_t)(((const uint8_t *)(p))[0]) << 8) | \
  62. (uint16_t)(((const uint8_t *)(p))[1]))
  63. #define POKE_U64(p, v) \
  64. do { \
  65. const uint64_t __v = (v); \
  66. ((uint8_t *)(p))[0] = (__v >> 56) & 0xff; \
  67. ((uint8_t *)(p))[1] = (__v >> 48) & 0xff; \
  68. ((uint8_t *)(p))[2] = (__v >> 40) & 0xff; \
  69. ((uint8_t *)(p))[3] = (__v >> 32) & 0xff; \
  70. ((uint8_t *)(p))[4] = (__v >> 24) & 0xff; \
  71. ((uint8_t *)(p))[5] = (__v >> 16) & 0xff; \
  72. ((uint8_t *)(p))[6] = (__v >> 8) & 0xff; \
  73. ((uint8_t *)(p))[7] = __v & 0xff; \
  74. } while (0)
  75. #define POKE_U32(p, v) \
  76. do { \
  77. const uint32_t __v = (v); \
  78. ((uint8_t *)(p))[0] = (__v >> 24) & 0xff; \
  79. ((uint8_t *)(p))[1] = (__v >> 16) & 0xff; \
  80. ((uint8_t *)(p))[2] = (__v >> 8) & 0xff; \
  81. ((uint8_t *)(p))[3] = __v & 0xff; \
  82. } while (0)
  83. #define POKE_U16(p, v) \
  84. do { \
  85. const uint16_t __v = (v); \
  86. ((uint8_t *)(p))[0] = (__v >> 8) & 0xff; \
  87. ((uint8_t *)(p))[1] = __v & 0xff; \
  88. } while (0)
  89. enum {
  90. SSH_MSG_DISCONNECT = 1,
  91. SSH_MSG_IGNORE = 2,
  92. SSH_MSG_UNIMPLEMENTED = 3,
  93. SSH_MSG_DEBUG = 4,
  94. SSH_MSG_SERVICE_REQUEST = 5,
  95. SSH_MSG_SERVICE_ACCEPT = 6,
  96. SSH_MSG_KEXINIT = 20,
  97. SSH_MSG_NEWKEYS = 21,
  98. /* 30 .. 49: KEX messages specific to KEX protocol */
  99. SSH_MSG_KEX_ECDH_INIT = 30,
  100. SSH_MSG_KEX_ECDH_REPLY = 31,
  101. /* 50... userauth */
  102. SSH_MSG_USERAUTH_REQUEST = 50,
  103. SSH_MSG_USERAUTH_FAILURE = 51,
  104. SSH_MSG_USERAUTH_SUCCESS = 52,
  105. SSH_MSG_USERAUTH_BANNER = 53,
  106. /* 60... publickey */
  107. SSH_MSG_USERAUTH_PK_OK = 60,
  108. /* 80... connection */
  109. SSH_MSG_GLOBAL_REQUEST = 80,
  110. SSH_MSG_REQUEST_SUCCESS = 81,
  111. SSH_MSG_REQUEST_FAILURE = 82,
  112. SSH_MSG_CHANNEL_OPEN = 90,
  113. SSH_MSG_CHANNEL_OPEN_CONFIRMATION = 91,
  114. SSH_MSG_CHANNEL_OPEN_FAILURE = 92,
  115. SSH_MSG_CHANNEL_WINDOW_ADJUST = 93,
  116. SSH_MSG_CHANNEL_DATA = 94,
  117. SSH_MSG_CHANNEL_EXTENDED_DATA = 95,
  118. SSH_MSG_CHANNEL_EOF = 96,
  119. SSH_MSG_CHANNEL_CLOSE = 97,
  120. SSH_MSG_CHANNEL_REQUEST = 98,
  121. SSH_MSG_CHANNEL_SUCCESS = 99,
  122. SSH_MSG_CHANNEL_FAILURE = 100,
  123. SSH_EXTENDED_DATA_STDERR = 1,
  124. SSH_CH_TYPE_SESSION = 1,
  125. SSH_CH_TYPE_SCP = 2,
  126. SSH_CH_TYPE_SFTP = 3,
  127. SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT = 1,
  128. SSH_DISCONNECT_PROTOCOL_ERROR = 2,
  129. SSH_DISCONNECT_KEY_EXCHANGE_FAILED = 3,
  130. SSH_DISCONNECT_RESERVED = 4,
  131. SSH_DISCONNECT_MAC_ERROR = 5,
  132. SSH_DISCONNECT_COMPRESSION_ERROR = 6,
  133. SSH_DISCONNECT_SERVICE_NOT_AVAILABLE = 7,
  134. SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED = 8,
  135. SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE = 9,
  136. SSH_DISCONNECT_CONNECTION_LOST = 10,
  137. SSH_DISCONNECT_BY_APPLICATION = 11,
  138. SSH_DISCONNECT_TOO_MANY_CONNECTIONS = 12,
  139. SSH_DISCONNECT_AUTH_CANCELLED_BY_USER = 13,
  140. SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE = 14,
  141. SSH_DISCONNECT_ILLEGAL_USER_NAME = 15,
  142. SSH_OPEN_ADMINISTRATIVELY_PROHIBITED = 1,
  143. SSH_OPEN_CONNECT_FAILED = 2,
  144. SSH_OPEN_UNKNOWN_CHANNEL_TYPE = 3,
  145. SSH_OPEN_RESOURCE_SHORTAGE = 4,
  146. KEX_STATE_EXPECTING_CLIENT_OFFER = 0,
  147. KEX_STATE_REPLIED_TO_OFFER,
  148. KEX_STATE_CRYPTO_INITIALIZED,
  149. SSH_KEYIDX_IV = 0,
  150. SSH_KEYIDX_ENC,
  151. SSH_KEYIDX_INTEG,
  152. /* things we may write on the connection */
  153. SSH_WT_NONE = 0,
  154. SSH_WT_VERSION,
  155. SSH_WT_OFFER,
  156. SSH_WT_OFFER_REPLY,
  157. SSH_WT_SEND_NEWKEYS,
  158. SSH_WT_UA_ACCEPT,
  159. SSH_WT_UA_FAILURE,
  160. SSH_WT_UA_BANNER,
  161. SSH_WT_UA_PK_OK,
  162. SSH_WT_UA_SUCCESS,
  163. SSH_WT_CH_OPEN_CONF,
  164. SSH_WT_CH_FAILURE,
  165. SSH_WT_CHRQ_SUCC,
  166. SSH_WT_CHRQ_FAILURE,
  167. SSH_WT_SCP_ACK_OKAY,
  168. SSH_WT_SCP_ACK_ERROR,
  169. SSH_WT_CH_CLOSE,
  170. SSH_WT_CH_EOF,
  171. SSH_WT_WINDOW_ADJUST,
  172. SSH_WT_EXIT_STATUS,
  173. /* RX parser states */
  174. SSH_INITIALIZE_TRANSIENT = 0,
  175. SSHS_IDSTRING,
  176. SSHS_IDSTRING_CR,
  177. SSHS_MSG_LEN,
  178. SSHS_MSG_PADDING,
  179. SSHS_MSG_ID,
  180. SSH_KEX_STATE_COOKIE,
  181. SSH_KEX_NL_KEX_ALGS_LEN,
  182. SSH_KEX_NL_KEX_ALGS,
  183. SSH_KEX_NL_SHK_ALGS_LEN,
  184. SSH_KEX_NL_SHK_ALGS,
  185. SSH_KEX_NL_EACTS_ALGS_LEN,
  186. SSH_KEX_NL_EACTS_ALGS,
  187. SSH_KEX_NL_EASTC_ALGS_LEN,
  188. SSH_KEX_NL_EASTC_ALGS,
  189. SSH_KEX_NL_MACTS_ALGS_LEN,
  190. SSH_KEX_NL_MACTS_ALGS,
  191. SSH_KEX_NL_MASTC_ALGS_LEN,
  192. SSH_KEX_NL_MASTC_ALGS,
  193. SSH_KEX_NL_CACTS_ALGS_LEN,
  194. SSH_KEX_NL_CACTS_ALGS,
  195. SSH_KEX_NL_CASTC_ALGS_LEN,
  196. SSH_KEX_NL_CASTC_ALGS,
  197. SSH_KEX_NL_LCTS_ALGS_LEN,
  198. SSH_KEX_NL_LCTS_ALGS,
  199. SSH_KEX_NL_LSTC_ALGS_LEN,
  200. SSH_KEX_NL_LSTC_ALGS,
  201. SSH_KEX_FIRST_PKT,
  202. SSH_KEX_RESERVED,
  203. SSH_KEX_STATE_ECDH_KEYLEN,
  204. SSH_KEX_STATE_ECDH_Q_C,
  205. SSHS_MSG_EAT_PADDING,
  206. SSH_KEX_STATE_SKIP,
  207. SSHS_GET_STRING_LEN,
  208. SSHS_GET_STRING,
  209. SSHS_GET_STRING_LEN_ALLOC,
  210. SSHS_GET_STRING_ALLOC,
  211. SSHS_DO_SERVICE_REQUEST,
  212. SSHS_DO_UAR_SVC,
  213. SSHS_DO_UAR_PUBLICKEY,
  214. SSHS_NVC_DO_UAR_CHECK_PUBLICKEY,
  215. SSHS_DO_UAR_SIG_PRESENT,
  216. SSHS_NVC_DO_UAR_ALG,
  217. SSHS_NVC_DO_UAR_PUBKEY_BLOB,
  218. SSHS_NVC_DO_UAR_SIG,
  219. SSHS_GET_U32,
  220. SSHS_NVC_CHOPEN_TYPE,
  221. SSHS_NVC_CHOPEN_SENDER_CH,
  222. SSHS_NVC_CHOPEN_WINSIZE,
  223. SSHS_NVC_CHOPEN_PKTSIZE,
  224. SSHS_NVC_CHRQ_RECIP,
  225. SSHS_NVC_CHRQ_TYPE,
  226. SSHS_CHRQ_WANT_REPLY,
  227. SSHS_NVC_CHRQ_TERM,
  228. SSHS_NVC_CHRQ_TW,
  229. SSHS_NVC_CHRQ_TH,
  230. SSHS_NVC_CHRQ_TWP,
  231. SSHS_NVC_CHRQ_THP,
  232. SSHS_NVC_CHRQ_MODES,
  233. SSHS_NVC_CHRQ_ENV_NAME,
  234. SSHS_NVC_CHRQ_ENV_VALUE,
  235. SSHS_NVC_CHRQ_EXEC_CMD,
  236. SSHS_NVC_CHRQ_SUBSYSTEM,
  237. SSHS_NVC_CH_EOF,
  238. SSHS_NVC_CH_CLOSE,
  239. SSHS_NVC_CD_RECIP,
  240. SSHS_NVC_CD_DATA,
  241. SSHS_NVC_CD_DATA_ALLOC,
  242. SSHS_NVC_WA_RECIP,
  243. SSHS_NVC_WA_ADD,
  244. SSHS_NVC_DISCONNECT_REASON,
  245. SSHS_NVC_DISCONNECT_DESC,
  246. SSHS_NVC_DISCONNECT_LANG,
  247. SSHS_SCP_COLLECTSTR = 0,
  248. SSHS_SCP_PAYLOADIN = 1,
  249. /* from https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13 */
  250. SECSH_FILEXFER_VERSION = 6,
  251. /* sftp packet types */
  252. SSH_FXP_INIT = 1,
  253. SSH_FXP_VERSION = 2,
  254. SSH_FXP_OPEN = 3,
  255. SSH_FXP_CLOSE = 4,
  256. SSH_FXP_READ = 5,
  257. SSH_FXP_WRITE = 6,
  258. SSH_FXP_LSTAT = 7,
  259. SSH_FXP_FSTAT = 8,
  260. SSH_FXP_SETSTAT = 9,
  261. SSH_FXP_FSETSTAT = 10,
  262. SSH_FXP_OPENDIR = 11,
  263. SSH_FXP_READDIR = 12,
  264. SSH_FXP_REMOVE = 13,
  265. SSH_FXP_MKDIR = 14,
  266. SSH_FXP_RMDIR = 15,
  267. SSH_FXP_REALPATH = 16,
  268. SSH_FXP_STAT = 17,
  269. SSH_FXP_RENAME = 18,
  270. SSH_FXP_READLINK = 19,
  271. SSH_FXP_LINK = 21,
  272. SSH_FXP_BLOCK = 22,
  273. SSH_FXP_UNBLOCK = 23,
  274. SSH_FXP_STATUS = 101,
  275. SSH_FXP_HANDLE = 102,
  276. SSH_FXP_DATA = 103,
  277. SSH_FXP_NAME = 104,
  278. SSH_FXP_ATTRS = 105,
  279. SSH_FXP_EXTENDED = 200,
  280. SSH_FXP_EXTENDED_REPLY = 201,
  281. /* sftp return codes */
  282. SSH_FX_OK = 0,
  283. SSH_FX_EOF = 1,
  284. SSH_FX_NO_SUCH_FILE = 2,
  285. SSH_FX_PERMISSION_DENIED = 3,
  286. SSH_FX_FAILURE = 4,
  287. SSH_FX_BAD_MESSAGE = 5,
  288. SSH_FX_NO_CONNECTION = 6,
  289. SSH_FX_CONNECTION_LOST = 7,
  290. SSH_FX_OP_UNSUPPORTED = 8,
  291. SSH_FX_INVALID_HANDLE = 9,
  292. SSH_FX_NO_SUCH_PATH = 10,
  293. SSH_FX_FILE_ALREADY_EXISTS = 11,
  294. SSH_FX_WRITE_PROTECT = 12,
  295. SSH_FX_NO_MEDIA = 13,
  296. SSH_FX_NO_SPACE_ON_FILESYSTEM = 14,
  297. SSH_FX_QUOTA_EXCEEDED = 15,
  298. SSH_FX_UNKNOWN_PRINCIPAL = 16,
  299. SSH_FX_LOCK_CONFLICT = 17,
  300. SSH_FX_DIR_NOT_EMPTY = 18,
  301. SSH_FX_NOT_A_DIRECTORY = 19,
  302. SSH_FX_INVALID_FILENAME = 20,
  303. SSH_FX_LINK_LOOP = 21,
  304. SSH_FX_CANNOT_DELETE = 22,
  305. SSH_FX_INVALID_PARAMETER = 23,
  306. SSH_FX_FILE_IS_A_DIRECTORY = 24,
  307. SSH_FX_BYTE_RANGE_LOCK_CONFLICT = 25,
  308. SSH_FX_BYTE_RANGE_LOCK_REFUSED = 26,
  309. SSH_FX_DELETE_PENDING = 27,
  310. SSH_FX_FILE_CORRUPT = 28,
  311. SSH_FX_OWNER_INVALID = 29,
  312. SSH_FX_GROUP_INVALID = 30,
  313. SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK = 31,
  314. SSH_PENDING_TIMEOUT_CONNECT_TO_SUCCESSFUL_AUTH =
  315. PENDING_TIMEOUT_USER_REASON_BASE + 0,
  316. SSH_AUTH_STATE_NO_AUTH = 0,
  317. SSH_AUTH_STATE_GAVE_AUTH_IGNORE_REQS = 1,
  318. };
  319. #define LWS_SSH_INITIAL_WINDOW 16384
  320. struct lws_ssh_userauth {
  321. struct lws_genhash_ctx hash_ctx;
  322. char *username;
  323. char *service;
  324. char *alg;
  325. uint8_t *pubkey;
  326. uint32_t pubkey_len;
  327. uint8_t *sig;
  328. uint32_t sig_len;
  329. char sig_present;
  330. };
  331. struct lws_ssh_keys {
  332. /* 3 == SSH_KEYIDX_IV (len=4), SSH_KEYIDX_ENC, SSH_KEYIDX_INTEG */
  333. uint8_t key[3][LWS_SIZE_CHACHA256_KEY];
  334. /* opaque allocation made when cipher activated */
  335. void *cipher;
  336. uint8_t MAC_length;
  337. uint8_t padding_alignment; /* block size */
  338. uint8_t valid:1;
  339. uint8_t full_length:1;
  340. };
  341. struct lws_kex {
  342. uint8_t kex_r[256];
  343. uint8_t Q_C[LWS_SIZE_EC25519]; /* client eph public key aka 'e' */
  344. uint8_t eph_pri_key[LWS_SIZE_EC25519]; /* server eph private key */
  345. uint8_t Q_S[LWS_SIZE_EC25519]; /* server ephemeral public key */
  346. uint8_t kex_cookie[16];
  347. uint8_t *I_C; /* malloc'd copy of client KEXINIT payload */
  348. uint8_t *I_S; /* malloc'd copy of server KEXINIT payload */
  349. uint32_t I_C_payload_len;
  350. uint32_t I_C_alloc_len;
  351. uint32_t I_S_payload_len;
  352. uint32_t kex_r_len;
  353. uint8_t match_bitfield;
  354. uint8_t newkeys; /* which sides newkeys have been applied */
  355. struct lws_ssh_keys keys_next_cts;
  356. struct lws_ssh_keys keys_next_stc;
  357. };
  358. struct lws_subprotocol_scp {
  359. char fp[128];
  360. uint64_t len;
  361. uint32_t attr;
  362. char cmd;
  363. char ips;
  364. };
  365. typedef union {
  366. struct lws_subprotocol_scp scp;
  367. } lws_subprotocol;
  368. struct per_session_data__sshd;
  369. struct lws_ssh_channel {
  370. struct lws_ssh_channel *next;
  371. struct per_session_data__sshd *pss;
  372. lws_subprotocol *sub; /* NULL, or allocated subprotocol state */
  373. void *priv; /* owned by user code */
  374. int type;
  375. uint32_t server_ch;
  376. uint32_t sender_ch;
  377. int32_t window;
  378. int32_t peer_window_est;
  379. uint32_t max_pkt;
  380. uint32_t spawn_pid;
  381. int retcode;
  382. uint8_t scheduled_close:1;
  383. uint8_t sent_close:1;
  384. uint8_t received_close:1;
  385. };
  386. struct per_vhost_data__sshd;
  387. struct per_session_data__sshd {
  388. struct per_session_data__sshd *next;
  389. struct per_vhost_data__sshd *vhd;
  390. struct lws *wsi;
  391. struct lws_kex *kex;
  392. char *disconnect_desc;
  393. uint8_t K[LWS_SIZE_EC25519]; /* shared secret */
  394. uint8_t session_id[LWS_SIZE_SHA256]; /* H from first working KEX */
  395. char name[64];
  396. char last_auth_req_username[32];
  397. char last_auth_req_service[32];
  398. struct lws_ssh_keys active_keys_cts;
  399. struct lws_ssh_keys active_keys_stc;
  400. struct lws_ssh_userauth *ua;
  401. struct lws_ssh_channel *ch_list;
  402. struct lws_ssh_channel *ch_temp;
  403. uint8_t *last_alloc;
  404. union {
  405. struct lws_ssh_pty pty;
  406. char aux[64];
  407. } args;
  408. uint32_t ssh_sequence_ctr_cts;
  409. uint32_t ssh_sequence_ctr_stc;
  410. uint64_t payload_bytes_cts;
  411. uint64_t payload_bytes_stc;
  412. uint32_t disconnect_reason;
  413. char V_C[64]; /* Client version String */
  414. uint8_t packet_assembly[2048];
  415. uint32_t pa_pos;
  416. uint32_t msg_len;
  417. uint32_t pos;
  418. uint32_t len;
  419. uint32_t ctr;
  420. uint32_t npos;
  421. uint32_t reason;
  422. uint32_t channel_doing_spawn;
  423. int next_ch_num;
  424. uint8_t K_S[LWS_SIZE_EC25519]; /* server public key */
  425. uint32_t copy_to_I_C:1;
  426. uint32_t okayed_userauth:1;
  427. uint32_t sent_banner:1;
  428. uint32_t seen_auth_req_before:1;
  429. uint32_t serviced_stderr_last:1;
  430. uint32_t kex_state;
  431. uint32_t chrq_server_port;
  432. uint32_t ch_recip;
  433. uint32_t count_auth_attempts;
  434. char parser_state;
  435. char state_after_string;
  436. char first_coming;
  437. uint8_t rq_want_reply;
  438. uint8_t ssh_auth_state;
  439. uint8_t msg_id;
  440. uint8_t msg_padding;
  441. uint8_t write_task[8];
  442. struct lws_ssh_channel *write_channel[8];
  443. uint8_t wt_head, wt_tail;
  444. };
  445. struct per_vhost_data__sshd {
  446. struct lws_context *context;
  447. struct lws_vhost *vhost;
  448. const struct lws_protocols *protocol;
  449. struct per_session_data__sshd *live_pss_list;
  450. const struct lws_ssh_ops *ops;
  451. };
  452. struct host_keys {
  453. uint8_t *data;
  454. uint32_t len;
  455. };
  456. extern struct host_keys host_keys[];
  457. extern int
  458. crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n,
  459. const unsigned char *p);
  460. extern int
  461. ed25519_key_parse(uint8_t *p, size_t len, char *type, size_t type_len,
  462. uint8_t *pub, uint8_t *pri);
  463. extern int
  464. kex_ecdh(struct per_session_data__sshd *pss, uint8_t *result, uint32_t *plen);
  465. extern uint32_t
  466. lws_g32(uint8_t **p);
  467. extern uint32_t
  468. lws_p32(uint8_t *p, uint32_t v);
  469. extern int
  470. lws_timingsafe_bcmp(const void *a, const void *b, uint32_t len);
  471. extern const char *lws_V_S;
  472. extern int
  473. lws_chacha_activate(struct lws_ssh_keys *keys);
  474. extern void
  475. lws_chacha_destroy(struct lws_ssh_keys *keys);
  476. extern uint32_t
  477. lws_chachapoly_get_length(struct lws_ssh_keys *keys, uint32_t seq,
  478. const uint8_t *in4);
  479. extern void
  480. poly1305_auth(u_char out[POLY1305_TAGLEN], const u_char *m, size_t inlen,
  481. const u_char key[POLY1305_KEYLEN]);
  482. extern int
  483. lws_chacha_decrypt(struct lws_ssh_keys *keys, uint32_t seq,
  484. const uint8_t *ct, uint32_t len, uint8_t *pt);
  485. extern int
  486. lws_chacha_encrypt(struct lws_ssh_keys *keys, uint32_t seq,
  487. const uint8_t *ct, uint32_t len, uint8_t *pt);
  488. extern void
  489. lws_pad_set_length(struct per_session_data__sshd *pss, void *start, uint8_t **p,
  490. struct lws_ssh_keys *keys);
  491. extern size_t
  492. get_gen_server_key_25519(struct per_session_data__sshd *pss, uint8_t *b, size_t len);
  493. extern int
  494. crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen,
  495. const unsigned char *m, size_t mlen,
  496. const unsigned char *sk);
  497. extern int
  498. crypto_sign_ed25519_keypair(struct lws_context *context, uint8_t *pk,
  499. uint8_t *sk);
  500. #endif