Pular para o conteúdo
De volta ao Nymchat

Base de conhecimento Sob o capô

Protocolo e eventos

O que o Nymchat realmente coloca na rede, para qualquer um que esteja construindo contra ele, auditá-lo ou ler eventos de outro cliente Nostr.

Tipos de eventos

TipoUsado paraNotas
0Metadados de perfilPerfil Nostr padrão: nome, foto, banner, sobre, lud16.
5Solicitações de exclusãoNIP-09.
7ReaçõesNIP-25, com ['k', originalKind] tag para que uma reação seja arquivada contra o tipo de canal correto.
13SeloA camada intermediária de uma mensagem NIP-17.
14Boato de mensagem privadaNão assinado e nunca publicado por conta própria.
1059Embrulho para presenteNIP-59. O que realmente atinge um retransmissor para mensagens privadas e bate-papos em grupo.
1984RelatóriosNIP-56.
9734 / 9735Solicitação de Zap e recebimento de ZapNIP-57.
10030Listas de pacotes de emojis personalizadosNIP-30.
20000Mensagem do canal GeohashEfêmero, marcado ['g', geohash].
23333Mensagem do canal nomeadoEfêmero, marcado ['d', channel].
24420 / 24421Indicadores públicos de digitação e recibos de leituraEspecífico do Nymchat, para canais públicos.
25051 / 25052Sinalização ponto a ponto e status de transferência de arquivosEspecífico do Nymchat.
30030Conjuntos de emojis personalizadosNIP-30.
30078Dados do aplicativoNIP-78. Enquetes e sincronização de configurações criptografadas.
69420Recibos de leitura privados e status de entregaEspecífico do Nymchat, divulgado como boato dentro de uma embalagem de presente. Um tipo separado de 14 deliberadamente, para que outros clientes NIP-17 não renderizem mensagens diretas em branco para cada recibo.

NIPs que Nymchat implementa

BELISCARO que isso oferece ao Nymchat
NIP-07Faça login com uma extensão do navegador.
NIP-09Solicitações de exclusão.
NIP-13Prova de trabalho. As mensagens de saída são extraídas em pelo menos 16 bits.
NIP-17Mensagens diretas privadas e base para bate-papos em grupo.
NIP-25Reações.
NIP-30Emoji personalizado.
NIP-40Carimbos de data e hora de expiração – mensagens que desaparecem.
NIP-44Criptografia versionada, usada para selos, wraps e sincronização de configurações.
NIP-46Assinatura remota — bunker://.
NIP-56Relatórios.
NIP-57Relâmpagos.
NIP-59Embrulhos para presente.
NIP-78Dados de aplicação arbitrários.
NIP-98Autenticação HTTP, para os endpoints hospedados.

Criptografia

OndeO que
Identidade e assinaturassecp256k1 com assinaturas Schnorr (BIP-340), conforme especifica Nostr.
Mensagens privadas e bate-papos em grupoNIP-44 v2: ECDH em secp256k1, HKDF-SHA256, ChaCha20 com HMAC-SHA256 e preenchimento para que o comprimento do texto cifrado não revele o comprimento da mensagem.
Sessões de malha BluetoothRuído XX — X25519, ChaCha20-Poly1305 (IETF), Ed25519 para assinaturas de anúncio, SHA-256 e HMAC abaixo.
Identidade em repousoAES-GCM-256. A chave vem de PBKDF2-SHA256 em 310.000 iterações para uma senha ou PIN, ou de uma saída WebAuthn PRF por meio de HKDF-SHA256 para uma chave de acesso ou biométrica.
Chamadas e transferências de arquivosO próprio DTLS-SRTP do WebRTC, negociado sobre sinalização encapsulada em NIP-17.
AleatoriedadeToda a plataforma CSPRNG – chaves, nonces e o jitter do carimbo de data/hora do embrulho para presente.

Proteção de metadados

Vale a pena destacar dois detalhes no caminho do embrulho para presente, porque são eles que separam o NIP-59 de "criptografado, mas obviamente de você para eles":

  • Cada envoltório é assinado por um chave única gerado apenas para essa mensagem, portanto, não há dois wraps que compartilhem um remetente.
  • Cada envoltório created_at é retroativo aleatoriamente em até dois horas usando o CSPRNG, portanto, os tempos de envio e recebimento não podem ser alinhados.

Bate-papos em grupo adicionam efêmero rotativo destinatário teclas em cima disso - veja Como funciona a criptografia de grupo.

Lendo a fonte

As cripto primitivas estão em js/nym-crypto.js e js/modules/key-vault.js no aplicativo da web e em android-ios-app/lib/core/crypto/ e lib/services/mesh/noise/ no aplicativo Flutter. O repositório é AGPL-3.0 e completo – não há nenhum componente fechado para confiar.