WaWeb canonical pipeline

Do socket à mensagem

Como o WhatsApp Web sai do nada e chega a mandar e receber uma mensagem: abre um canal seguro, pede autorização ao celular principal, autentica a sessão, baixa o estado da conta e troca mensagens.

Socket, Noise e PairCode

Detalhes desde a abertura do WebSocket até o pareamento aceito pelo celular principal.

Detalhes nesta página

Cada link abaixo abre um bloco analítico com leitura didática, contrato observado e mini pipeline.

WebSocket criado

observadopipeline seq 4-14

Leitura

O navegador abre dois sockets quase em paralelo. O ws-1 carrega o pareamento; o ws-2 recebe 101 e fecha sem carregar stanza.

Entrada chromium_started, recorder anexado e handshake HTTP de WebSocket.
Saída ws-1 pronto para receber os frames binários do Noise.

Mini pipeline

SeqEventoContrato
4-5transportwebsocket_created para ws-1 e ws-2.
6-7requestHeaders por nome; valores como Cookie/User-Agent ficam fora do relatório.
8, 11responseHTTP 101 aceita o upgrade para WebSocket.
14closews-2 fecha sem stanza associada.

Ponto de convergência: o cliente C# deve reproduzir a existência de sockets auxiliares ou, no mínimo, explicar a divergência no diff.

client_hello

inferidopipeline seq 9-10

Leitura

O primeiro frame binário pré-stanza é interpretado pelo recorder como client_hello. Ele abre o handshake Noise e ainda não é uma stanza WAP.

Framews-1, direção sent, opcode binário, 43 bytes.
ConfiançaO evento vem de source=inferred_from_pre_stanza_binary_frame.

Mini pipeline

SeqCamadaContrato
9wirewebsocket_frame sent, payload_kind=binary, payload_size=43.
10noiseclient_hello, wire_frame_index=1.

Não publicar chave efêmera nem bytes do frame. O relatório só precisa da forma e do tamanho.

server_hello

inferidopipeline seq 12-13

Leitura

O servidor responde no mesmo ws-1 com um frame binário maior. A captura o classifica como a segunda etapa do Noise.

Framerecv, opcode binário, 350 bytes.
SaídaCliente tem material para finalizar o handshake.

Mini pipeline

SeqCamadaContrato
12wirewebsocket_frame recv, payload_size=350.
13noiseserver_hello, wire_frame_index=2.

client_finish

inferidopipeline seq 15-16

Leitura

O terceiro frame pré-stanza encerra a negociação Noise. Depois dele, o próximo evento estruturado já é uma stanza decodificada.

Framesent, opcode binário, 372 bytes.
TransiçãoNoise concluído → tráfego WAP decodificável.

Mini pipeline

SeqCamadaContrato
15wirewebsocket_frame sent, payload_size=372.
16noiseclient_finish, wire_frame_index=3.

Primeiro WAP decodificado

observadostanza 1 · seq 17

Leitura

Esse é o primeiro nó WAP legível depois do Noise. Ele prova que o canal cifrado já transporta stanzas estruturadas.

Stanzarecv iq, attrs [from,id,type,xmlns].
Filhopair-device, contendo 6 filhos ref com conteúdo em bytes.

Mini pipeline

StanzaSeqContrato
117recv iq / pair-device.
218sent iq / empty, resposta curta ao servidor.

pair-device

observadostanzas 1-2

Leitura

O servidor entrega referências temporárias para amarrar a tentativa de pareamento ao celular principal. Os valores das refs não devem sair da captura local.

Recebidopair-device com 6 ref.
Respondidosent iq vazio, usado como confirmação técnica.

Mini pipeline

StanzaSeqContrato
117recv iq, child pair-device, refs em bytes.
218sent iq, sem filhos.

companion reg

observadostanzas 3-4 e 9

Leitura

O cliente se apresenta como companion em etapas. Primeiro envia o estágio, depois manda plataforma, chaves públicas e nonce, e mais tarde envia o pacote de chave para o pareamento.

Campos voláteisjid, nonce, refs, chaves públicas e bundles.
Contrato fixoTag link_code_companion_reg, attrs por nome e ordem relativa dos estágios.

Mini pipeline

StanzaSeqContrato
321sent iq / link_code_companion_reg, attr stage.
423Attrs jid, should_show_push_notification, stage; filhos de chaves, plataforma e nonce.
933Attrs jid, stage; filhos link_code_pairing_wrapped_key_bundle, companion_identity_public, link_code_pairing_ref.

country + ref

observadostanzas 5-6

Leitura

São duas respostas distintas: uma informa o país do número e a outra devolve uma nova referência de pareamento. O mapa junta as duas por leitura visual, mas o contrato separa.

Stanza 5country_code com attr iso.
Stanza 6link_code_companion_reg com link_code_pairing_ref.

Mini pipeline

StanzaSeqContrato
525recv iq / country_code.
627recv iq / link_code_companion_reg, child link_code_pairing_ref.

primary hello

observadostanzas 7-8

Leitura

O servidor entrega a notificação vinda do aparelho principal. Ela carrega chave efêmera, identidade primária e ref. O cliente responde com ack.

Recebidonotification / link_code_companion_reg com attrs [from,id,t,type].
Respondidosent ack com attrs [class,id,to,type].

Mini pipeline

StanzaSeqContrato
729link_code_pairing_wrapped_primary_ephemeral_pub, primary_identity_pub, link_code_pairing_ref.
830sent ack da notificação.

pair-success

observadostanzas 10-12

Leitura

O servidor aceita o pareamento e entrega metadados de jurisdição, criptografia, plataforma, identidade do dispositivo e dados de negócio. O cliente fecha com pair-device-sign.

pair-successjurisdiction, encryption-metadata, client-props, platform, device-identity, biz, device.
Assinaturapair-device-sign / device-identity com key-index.

Mini pipeline

StanzaSeqContrato
1035recv iq vazio.
1137recv iq / pair-success.
1239sent iq / pair-device-sign.