secure-chat/RFC8497.md

7.3 KiB

Encrypted Illegitimate Communication Peer to Peer Protocol - EICP2P2 - V1

Présentation

Ce protocole est le protocole utilisé pour la communication entre les clients et les nœuds du réseau de communication EIC.

Architecture du réseau

C1  C2      C3  C4
  \/          \/
  N1          N2
    \        /
C5 - N3 -- N4 - C6
      |    | \ 
     N5 - N8  C7
      |   |
C9 - N6 - N7 - C8
      |    |
     C10  C11

Cn sont des clients, Nn sont des noeuds.

Principe

Pour communiquer, les clients se connectent aux nœuds et leur communication est transférée de manière transparente et cryptée.

Par exemple, pour communiquer avec le client 5, le client 3 se connecte au nœud 2, qui transfère sa communication au nœud 4, puis au nœud 3 et enfin au client 5.

Chaque noeud et chaque client a un id unique qui permet de l'identifier sur le réseau.

Chaque noeud possède trois tables de correspondances: une qui associe l'id d'un noeud à une addresse ip, une qui associe l'id d'un client au noeud sur lequel il est connecté (y compris sur le noeud même) et une qui associe les addresses ip des clients connectés au noeud et leurs id

La première table qui associe id d'un noeud et son addresse ip sera appelé table_noeud dans la suite du document. La table qui associe les id d'utilisateur à leur noeud de connection sera désigné table_id_noeud. Enfin celle qui associe un client à son addresse ip sera désigné table_ip_client.

Structure de la requête

Les requêtes sont divisées en deux parties : un en-tête et un corps. L'en-tête contient les informations utiles à la communication (version du protocole, adresse IP, port, type de requête...) et le corps contient les données à transférer.

Exemple d'entête:

EICP2P2 v1
host: 135.32.5.73:3353
type: ping

Communication entre les noeuds

Ping

En-tête:
EICP2P2 V1
type: ping
Contenu:
hash_de_la_table_noeud::hash_de_la_table_id_noeud
Utilisation:

Cette requête est envoyée pour virifier qu'un noeud est toujours actif ou pour rajouter un noeud au réseau (le ping permet de recevoir la liste des noeuds connus et d'ajouter l'emeteur à la liste des noeuds).

Si le hash de la table des noeuds, ou de celle de la table id_noeud reçue est différent de celle de celle que le noeud posède, on envoie une requête updateAsk pour recevoir les tables complètes.

Dans tous les cas le destinataire doit envoyer un pingACK.

PingAck

En-tête
EICP2P2 V1
type: pingACK
Contenu
hash_de_la_table_noeud::hash_de_la_table_id_noeud
Utilisation

Cette requête est envoyé en retour à un ping.

Si le hash de la table des noeuds, ou de celle de la table id_noeud reçue est différent de celle de celle que le noeud posède, on envoie une requête updateAsk pour recevoir les tables complètes.

updateAsk

En-tête
EICP2P2 V1
type: updateAsk
Contenu
table_noeud
table_id_noeud
Utilisation

Cette requête est envoyée pour actualiser les listes table_noeuds et table_id_noeuds, on envoie le contenu du noeud émmeteur et le récepteur renvoie le sien en échange avec un updateBack.

updateBack

En-tête
EICP2P2 V1
type: updateBack
Contenu
table_noeud
table_id_noeud
Utilisation

Réponse à updateAsk.

transfer

En-tête
EICP2P2 V1
type: transfer
Contenu
requête_à_transférer
Utilisation

Permet de transférer une requête directement grâce au champ dest de la requête à transférer.

Communication entre un client et un noeud

Register

En-tête
EICP2P2 V1
type: register_client
Contenu
Rien
Utilisation

Cette requête est envoyée par un client pour s'enregistrer sur le réseau. Le serveur répond avec un registerACK.

RegisterACK

En-tête
EICP2P2 V1
type: registerACK
Contenu
id_noeud{%=&%&=%}id_client
Utilisation

Réponse à un register_client. Le noeud communique au client son id et l'id du noeud auquel il est connecté.

Send

En-tête
EICP2P2 V1
type: send
to: id_client_destinataire
Contenu
message_a_envoyer
Utilisation

Cette requête est envoyé par un client enregistré à un noeud pour envoyer un message à un autre client. Le noeud va tansférer le message au client, soit directement, soit par d'autre noeuds. La requête sendACK est envoyée en retour.

SendACK

En-tête
EICP2P2 V1
type: sendACK
Contenu
Rien/Erreur client incunnu
Utilisation

Cette requête est envoyée par le destinataire d'une requête send après avoir transféré le message et avoir reçu le sendACK associé à l'envoi.

C1                    N1                    C2
        > send >              > send >       
              Wait sendACK from C2
       < sendACK <          < sendACK <

Exit

En-tête
EICP2P2 V1
type: exit
Contenu
id_client
Utilisation

Envoyé par le client pour se déconnecter du réseau. Ne demande aucune réponse de la part du noeud.

Get users

En-tête
EICP2P2 V1
type: getUsers
Contenu
Rien

Get User ACK

En-tête
EICP2P2 V1
type: getUsersACK
Contenu
Listedesutilisateurs

Ping

En-tête
EICP2P2 V1
type: ping
Contenu
Rien
Utilisation

Envoyé par le serveur pour vérifier qu'un client est encore en ligne. Exige une réponse pingACK de la part du client.

PingACK

En-tête
EICP2P2 V1
type: pingACK
Contenu
Rien
Utilisation

Réponse du client à une requête de ping.

Initialisation des connections

RSASend

En clair

En-tête
EICP2P2 V1
type: RSASend
from: noeud/client
Contenu
Clef RSA publique de celui qui emmet la requête
Utilisation

Cette requête est utilisé pour initialiser la communication crypté entre deux noeud/client.

Init

Chiffré avec la clef RSA publique recue avec la requete RSASend

En-tête
EICP2P2 V1
type: init
Contenu
Clef AES
Utilisation

Requête envoyée en réponse à RSASend pour initialiser la connection cryptée en AES.

Error

Error

Tables

Table 1:

Sur un noeud, totalement privée

ip/port -- rsa_client_public -- Clef AES

Table 2:

Sur un noeud, partagée avec les autre neouds

ip/port -- rsa_public_noeud(modifié)

Table 3:

Sur on noeud, partagé avec les autres noeuds

rsa_public_client -- rsa_public_noeud