|
|
|
|
@ -124,6 +124,7 @@ static int client_derive_session(struct stcp_conn *c, const uint8_t *peer_pubkey
|
|
|
|
|
sc_init_ctx(&sc, &c->my_keys); |
|
|
|
|
if (sc_set_peer_public_key(&sc, peer_pubkey, SC_PEER_PUBKEY_BIN) != SC_OK) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "client ECDH failed"); return -1; } |
|
|
|
|
memcpy(c->session_key, sc.session_key, SC_SESSION_KEY_SIZE); |
|
|
|
|
log_dump(DEBUG_LEVEL_ERROR, DEBUG_CATEGORY_DEBUG, "stcp_client session_key", c->session_key, 16); |
|
|
|
|
if (sc_stream_init(&sc, &c->stream_send, STCP_STREAM_CLIENT_SEND) != SC_OK) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "client stream_send init failed"); return -1; } |
|
|
|
|
if (sc_stream_init(&sc, &c->stream_recv, STCP_STREAM_SERVER_SEND) != SC_OK) { DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "client stream_recv init failed"); return -1; } |
|
|
|
|
return 0; |
|
|
|
|
@ -163,8 +164,10 @@ static void process_server_response(struct stcp_conn *c) {
|
|
|
|
|
} |
|
|
|
|
uint8_t enc_hs[STCP_HS_ENC_SERVER]; |
|
|
|
|
memcpy(enc_hs, c->recv_buf + SC_PUBKEY_ENC_SIZE, STCP_HS_ENC_SERVER); |
|
|
|
|
log_dump(DEBUG_LEVEL_ERROR, DEBUG_CATEGORY_DEBUG, "stcp_client enc_hs BEFORE xor", enc_hs, STCP_HS_ENC_SERVER); |
|
|
|
|
size_t hs_data_len; |
|
|
|
|
if (decrypt_and_check(enc_hs, STCP_HS_ENC_SERVER, &c->stream_recv, &hs_data_len)) { client_do_close(c, 3); return; } |
|
|
|
|
log_dump(DEBUG_LEVEL_ERROR, DEBUG_CATEGORY_DEBUG, "stcp_client enc_hs AFTER xor", enc_hs, STCP_HS_ENC_SERVER); |
|
|
|
|
uint8_t status = enc_hs[0]; |
|
|
|
|
uint16_t padding_size = (uint16_t)enc_hs[1] | ((uint16_t)enc_hs[2] << 8); |
|
|
|
|
c->hs_expected_len = SC_PUBKEY_ENC_SIZE + STCP_HS_ENC_SERVER + padding_size; |
|
|
|
|
|