Seus pacotes são problema de mais ninguém além de você.
Wi-Fi é um meio compartilhado. Cafés, hotéis, alojamentos, LAN parties. Qualquer um na mesma rede pode ver o seu tráfego. O Dish foi construído com isso em mente.
Modelo de ameaças
O Dish foi construído para se manter seguro em redes que você não confia totalmente:
- Um colega de quarto ou vizinho no mesmo Wi-Fi não deveria conseguir injetar entradas de controle no seu jogo.
- Alguém rodando
tcpdumpno roteador não deveria ver o que você está jogando ou como está jogando. - Um pacote capturado não deveria poder ser reproduzido uma hora depois.
- O pareamento deveria falhar fechado. Nunca um fallback silencioso para texto puro.
- A superfície de configuração não deveria ser alcançável pela LAN. Só o caminho criptografado do controle é.
Pareamento
Da primeira vez que você conecta o Dish ao Satellite, o Satellite mostra um PIN de 4 dígitos no seu PC gamer. O PIN dura cinco minutos e então expira. Você o digita no Dish no seu celular, notebook ou outro dispositivo cliente.
O pareamento acontece sobre HTTPS na porta 9443, em um certificado autoassinado que o Satellite gera localmente. O transporte protege contra escutas passivas; o PIN protege contra alguém enganando o Satellite para confiar nele. O cliente envia uma chave pública X25519 de 32 bytes, o Satellite calcula o segredo compartilhado com crypto_scalarmult, e a partir daí os dois lados guardam uma chave simétrica de 256 bits derivada sem nunca ser enviada pelo fio. O PIN em si é destruído assim que o pareamento termina.
A chave compartilhada é armazenada localmente nos dois lados e usada para autenticar cada reconexão subsequente. No lado do Satellite ela vive no diretório de configuração por usuário da sua plataforma, protegida por modo para a sua conta (Windows DPAPI na V1); no lado do cliente Android ela vive nas SharedPreferences privadas do app, sandboxed pelo Android ao app Dish e excluída do backup em nuvem e da transferência de dispositivo. Nenhuma chave sai de qualquer dos dispositivos.
AEAD por pacote
Cada pacote de controle (input do controle, heartbeat, controller-add, vibração, movimento, bateria, touchpad, lightbar) é selado com ChaCha20-Poly1305 (IETF), o mesmo AEAD que TLS 1.3, WireGuard e SSH usam. ChaCha20 é rápido e de tempo constante em toda CPU com que nos importamos, incluindo o ARMv8 do Android e o Apple Silicon.
O formato de fio é pequeno e rígido: token de sessão de 4 bytes, contador de 4 bytes, ciphertext, tag de autenticação Poly1305 de 16 bytes. O token serve como dados autenticados adicionais (AAD), então trocá-lo em um pacote replay faz a verificação falhar. O nonce é o contador com zero-padding para 12 bytes, e nenhum reuso de nonce é possível sem rotacionar a sessão.
Proteção contra replay
O Satellite armazena o maior contador que aceitou em cada conexão. Qualquer pacote cujo contador seja menor ou igual a esse marco é descartado antes mesmo de chegar no backend do controle. Ciphertext capturado da sessão de ontem (ou mesmo de um segundo atrás) não pode ser reproduzido para disparar um botão apertado.
Com o que você não precisa se preocupar
- Escuta. Ninguém na LAN descobre quais botões você apertou.
- Spoofing. Sem a chave de sessão, nenhum atacante pode injetar um "botão B" apertado, mesmo conhecendo o seu IP.
- Replay. O pacote de "atirar" de ontem não vai atirar hoje. Nem o heartbeat ou o pacote de pareamento de ontem.
- Downgrade. Sem fallback para texto puro. Se a verificação de criptografia falhar, o pacote morre silenciosamente.
- Adulteração de config remota. A API admin (
localhost:9877) só faz bind em127.0.0.1. A API HTTPS voltada para a LAN na 9443 só expõe endpoints de pareamento e sessão, todos restritos por um ID de dispositivo pareado.
Zero analytics, zero anúncios
Dish e Satellite coletam nenhum dado de uso, nenhum identificador, nenhum analytics, nenhum ID de publicidade. O único fluxo de saída tocado pela TinkerNorth no Dish para Android é o Firebase Crashlytics opt-out para relatos de crash e ANR: stack trace, modelo do aparelho, UUID de instalação, e só. Nunca entrada de controle, nunca IPs do Satellite, nunca SSIDs de Wi-Fi. Há um opt-out com um toque nas Configurações do app em Diagnósticos, honrado antes que qualquer crash possa ser carregado na próxima inicialização. O Satellite em si vem sem SDK de relato de crash de nenhum tipo. O escopo completo está na política de privacidade do Dish para Android.
Não rodamos um sistema de contas. Não há nuvem. Nada para vazar porque não há nada em um servidor para vazar.
Cadeia de suprimentos auditável
Toda versão com tag vem com:
- Um arquivo de checksum SHA-256 para cada artefato, assinado sem chave via
cosigne a identidade OIDC do workflow de release do GitHub Actions. - Uma atestação de procedência SLSA Level 3 provando que o artefato foi construído a partir do commit com tag no CI.
- Um software bill of materials nos formatos SPDX e CycloneDX, para que você possa auditar cada dependência transitiva.
A receita do verify-blob vive no SECURITY.md no repositório do Satellite. Se um download não bate com o checksum publicado, não instale.
Código aberto e auditável
Cada linha de código que toca criptografia vive em um repositório público. O Satellite usa libsodium; o Dish para Android usa libsodium-stable construído via NDK e o Conscrypt padrão do Android para o transporte HTTPS de pareamento. Sem criptografia caseira. Sem "escrevemos o nosso próprio ChaCha".
Distribuído sob a GNU Lesser General Public License v3.0 or later. Encontrou algo estranho? O SECURITY.md no repositório do Satellite tem a nossa política de divulgação.