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