Passer au contenu
Retour à Nymchat

Base de connaissances Sous le capot

Protocole et événements

Ce que Nymchat met réellement sur le fil, pour quiconque construit contre cela, l'auditer ou lire les événements d'un autre client Nostr.

Types d'événements

GentilUtilisé pourRemarques
0Métadonnées du profilProfil Nostr standard : nom, photo, bannière, à propos, lud16.
5Demandes de suppressionPIN-09.
7RéactionsNIP-25, avec un ['k', originalKind] tag afin qu'une réaction soit déposée contre le bon type de canal.
13JointLa couche intermédiaire d'un message NIP-17.
14Rumeur de message privéNon signé et jamais publié seul.
1059Emballage cadeauPIN-59. De quoi parvenir en fait à un relais pour les messages privés et les discussions de groupe.
1984RapportsPIN-56.
9734 / 9735Demande de zap et reçu de zapPIN-57.
10030Listes de packs d'emoji personnalisésPIN-30.
20000Message du canal GeohashÉphémère, tagué ['g', geohash].
23333Message de canal nomméÉphémère, tagué ['d', channel].
24420 / 24421Indicateurs de frappe publics et accusés de lectureSpécifique à Nymchat, pour les chaînes publiques.
25051 / 25052Signalisation peer-to-peer et statut de transfert de fichiersSpécifique à Nymchat.
30030Ensembles d'emojis personnalisésPIN-30.
30078Données de candidaturePIN-78. Synchronisation des sondages et des paramètres cryptés.
69420Accusés de lecture privés et état de livraisonSpécifique à Nymchat, porté comme une rumeur dans un emballage cadeau. Un genre distinct de 14 délibérément, de sorte que les autres clients NIP-17 n'affichent pas de messages directs vierges pour chaque reçu.

NIP mis en œuvre par Nymchat

PINCERCe que ça donne à Nymchat
PIN-07Connectez-vous avec une extension de navigateur.
PIN-09Demandes de suppression.
PIN-13Preuve de travail. Les messages sortants sont extraits sur au moins 16 bits.
PIN-17Messages directs privés et base des discussions de groupe.
PIN-25Réactions.
PIN-30Émoji personnalisé.
PIN-40Horodatages d’expiration – messages qui disparaissent.
PIN-44Cryptage versionné, utilisé pour les sceaux, les enveloppes et la synchronisation des paramètres.
PIN-46Signature à distance — bunker://.
PIN-56Rapport.
PIN-57La foudre zappe.
PIN-59Emballages cadeaux.
PIN-78Données d'application arbitraires.
PIN-98Authentification HTTP, pour les points de terminaison hébergés.

Cryptographie

Quoi
Identité et signaturessecp256k1 avec les signatures Schnorr (BIP-340), comme le précise Nostr.
Messages privés et discussions de groupeNIP-44 v2 : ECDH sur secp256k1, HKDF-SHA256, ChaCha20 avec HMAC-SHA256 et remplissage pour que la longueur du texte chiffré ne donne pas la longueur du message.
Sessions maillées BluetoothNoise XX — X25519, ChaCha20-Poly1305 (IETF), Ed25519 pour les signatures d'annonce, SHA-256 et HMAC en dessous.
Identité au reposAES-GCM-256. La clé provient de PBKDF2-SHA256 à 310 000 itérations pour un mot de passe ou un code PIN, ou d'une sortie WebAuthn PRF via HKDF-SHA256 pour un mot de passe ou une clé biométrique.
Appels et transferts de fichiersLe propre DTLS-SRTP de WebRTC, négocié via une signalisation enveloppée NIP-17.
Le hasardLa plate-forme CSPRNG partout : les clés, les noms occasionnels et la gigue de l'horodatage de l'emballage cadeau.

Protection des métadonnées

Deux détails dans le parcours des emballages cadeaux méritent d'être soulignés, car c'est ce qui sépare le NIP-59 de "crypté, mais évidemment de vous à eux":

  • Chaque emballage est signé par un clé à usage unique généré pour ce seul message, donc pas deux wraps ne partagent un expéditeur.
  • Chaque emballage est created_at est antidaté aléatoirement jusqu'à deux heures en utilisant CSPRNG, les heures d'envoi et de réception ne peuvent donc pas être alignées.

Les discussions de groupe ajoutent des échanges éphémères en rotation destinataire clés en plus - voir Comment fonctionne le chiffrement de groupe.

Lire la source

Les primitives cryptographiques sont dans js/nym-crypto.js et js/modules/key-vault.js dans l'application Web et sous android-ios-app/lib/core/crypto/ et lib/services/mesh/noise/ dans l'application Flutter. Le dépôt est AGPL-3.0 et complet — il n'y a pas de composant fermé auquel faire confiance.