@ -499,6 +499,9 @@ static void cs_on_conn_up(struct ETCP_CONN* conn, void* arg) {
if ( g_cs - > pending_invite_ch_id ! = 0 & & ! g_cs - > info_req_timer ) {
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: conn_up invite path peer=%016llx ch=%llu " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) g_cs - > pending_invite_ch_id ) ;
if ( g_cs - > pending_invite_node_id ! = 0 & & g_cs - > pending_invite_node_id ! = peer )
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: invite node_id MISMATCH: invite=0x%016llx ETCP_peer=0x%016llx — invite is STALE! " ,
CS_ID , ( unsigned long long ) g_cs - > pending_invite_node_id , ( unsigned long long ) peer ) ;
g_cs - > pending_invite_node_id = peer ;
char ch_id_str [ 64 ] ;
snprintf ( ch_id_str , sizeof ( ch_id_str ) , " %llu " ,
@ -785,6 +788,9 @@ static void cs_handle_channel_info_req(struct chat_sync* cs, uint64_t peer,
return ;
}
uint64_t myid = cs - > inst - > node_id ;
if ( memcmp ( cs - > inst - > my_keys . public_key , x25519 , 32 ) ! = 0 )
DEBUG_WARN ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP pubkey MISMATCH: my=%016llx ch=%016llx — channel was created with DIFFERENT keys! " ,
CS_ID , * ( const uint64_t * ) cs - > inst - > my_keys . public_key , * ( const uint64_t * ) x25519 ) ;
uint8_t my_join_sig [ 64 ] = { 0 } ;
uint8_t join_msg [ 256 ] ; size_t mlen = 0 ;
mlen + = snprintf ( ( char * ) join_msg + mlen , sizeof ( join_msg ) - mlen , " %s " , ch_id ) + 1 ;
@ -793,6 +799,9 @@ static void cs_handle_channel_info_req(struct chat_sync* cs, uint64_t peer,
{ const char * nm = cs - > inst - > name [ 0 ] ? cs - > inst - > name : " " ;
size_t nl = strlen ( nm ) ; memcpy ( join_msg + mlen , nm , nl ) ; mlen + = nl ; join_msg [ mlen + + ] = ' \0 ' ; }
cs_ed25519_sign ( cs - > inst - > my_ed25519_privkey , join_msg , mlen , my_join_sig ) ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: CHANNEL_INFO_RESP signed my_join_sig: myid=%016llx my_pub=%016llx ch_pub=%016llx name=%s " ,
CS_ID , ( unsigned long long ) myid , * ( const uint64_t * ) cs - > inst - > my_keys . public_key ,
* ( const uint64_t * ) x25519 , cs - > inst - > name ) ;
uint8_t buf [ 1024 ] ; size_t boff = 0 ;
buf [ boff + + ] = CS_MSG_CHANNEL_INFO_RESP ;
@ -823,6 +832,10 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
const uint8_t * ch_sig = p ; p + = 64 ;
const uint8_t * inviter_join_sig = p ;
DEBUG_DEBUG ( DEBUG_CATEGORY_DEBUG , " %s: CHANNEL_INFO_RESP from peer=%016llx owner=%016llx ch_x25519=%016llx ch_ed=%016llx name=%s " ,
CS_ID , ( unsigned long long ) peer , ( unsigned long long ) owner ,
* ( const uint64_t * ) x25519 , * ( const uint64_t * ) ed_pub , name ) ;
/* verify channel signature */
uint8_t vmsg [ 1024 ] ; size_t vlen = 0 ;
vlen + = snprintf ( ( char * ) vmsg + vlen , sizeof ( vmsg ) - vlen , " %s " , ch_id ) + 1 ;
@ -855,10 +868,11 @@ static void cs_handle_channel_info_resp(struct chat_sync* cs, uint64_t peer,
memcpy ( ivmsg + ilen , & peer , 8 ) ; ilen + = 8 ;
memcpy ( ivmsg + ilen , x25519 , 32 ) ; ilen + = 32 ;
{ char nnm [ 64 ] = " " ; _get_node_name ( vdb , peer , nnm , sizeof ( nnm ) ) ;
size_t nl = strlen ( nnm ) ; memcpy ( ivmsg + ilen , nnm , nl ) ; ilen + = nl ; ivmsg [ ilen + + ] = ' \0 ' ; }
if ( cs_ed25519_verify ( inv_ed , ivmsg , ilen , inviter_join_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP invalid inviter_join_sig peer=%016llx " ,
CS_ID , ( unsigned long long ) peer ) ;
size_t nl = strlen ( nnm ) ; memcpy ( ivmsg + ilen , nnm , nl ) ; ilen + = nl ; ivmsg [ ilen + + ] = ' \0 ' ;
if ( cs_ed25519_verify ( inv_ed , ivmsg , ilen , inviter_join_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: CHANNEL_INFO_RESP invalid inviter_join_sig peer=%016llx x25519=%016llx inv_ed=%016llx name=%s " ,
CS_ID , ( unsigned long long ) peer , * ( const uint64_t * ) x25519 , * ( const uint64_t * ) inv_ed , nnm ) ;
}
}
}
@ -946,8 +960,9 @@ static void cs_handle_channel_join(struct chat_sync* cs, uint64_t peer,
{ sqlite3 * tdb = cs - > inst - > topo_groups - > topo_sqlite_db ; char nnm [ 64 ] = " " ; _get_node_name ( tdb , node_id , nnm , sizeof ( nnm ) ) ;
size_t nl = strlen ( nnm ) ; memcpy ( vmsg + vlen , nnm , nl ) ; vlen + = nl ; vmsg [ vlen + + ] = ' \0 ' ; }
if ( cs_ed25519_verify ( ed_pub , vmsg , vlen , join_sig ) ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: JOIN invalid sig node=0x%016llx ch=%s " , CS_ID ,
( unsigned long long ) node_id , ch_id ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: JOIN invalid sig node=0x%016llx ch=%s — signed(node=%016llx x25519=%016llx ed=%016llx) " , CS_ID ,
( unsigned long long ) node_id , ch_id ,
( unsigned long long ) node_id , * ( const uint64_t * ) x25519 , * ( const uint64_t * ) ed_pub ) ;
return ;
}