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