secure-chat/RFC8497.md

335 lines
7.3 KiB
Markdown
Raw Permalink Normal View History

2018-11-13 01:14:19 +01:00
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.
2018-11-13 15:48:00 +01:00
Communication entre un client et un noeud
-----------------------------------------
### Register ###
###### En-tête ######
EICP2P2 V1
type: register_client
2018-11-13 15:48:00 +01:00
###### 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
2018-11-13 15:48:00 +01:00
###### Utilisation ######
Réponse à un `register_client`. Le noeud communique au client son id et l'id du noeud auquel il est connecté.
2018-11-13 15:48:00 +01:00
### 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
2018-11-13 15:48:00 +01:00
###### 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
2018-11-13 15:48:00 +01:00
### 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 ######
2018-11-13 21:27:10 +01:00
Réponse du client à une requête de ping.
2018-11-13 15:48:00 +01:00
2018-11-13 21:27:10 +01:00
Initialisation des connections
------------------------------
2018-11-15 20:29:32 +01:00
### RSASend ###
2018-11-13 21:27:10 +01:00
> En clair
###### En-tête ######
EICP2P2 V1
2018-11-19 21:50:36 +01:00
type: RSASend
from: noeud/client
2018-11-13 21:27:10 +01:00
###### 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.
2018-11-13 15:48:00 +01:00
2018-11-13 21:27:10 +01:00
### Init ###
2018-11-15 20:29:32 +01:00
> Chiffré avec la clef RSA publique recue avec la requete RSASend
2018-11-13 21:27:10 +01:00
###### En-tête ######
2018-11-13 15:48:00 +01:00
2018-11-13 21:27:10 +01:00
EICP2P2 V1
type: init
###### Contenu ######
Clef AES
2018-11-13 21:32:49 +01:00
###### Utilisation ######
2018-11-13 15:48:00 +01:00
2018-11-15 20:29:32 +01:00
Requête envoyée en réponse à RSASend pour initialiser la connection cryptée en AES.
2018-11-16 21:54:30 +01:00
2018-11-15 20:29:32 +01:00
### Error ###
Error
2018-11-13 21:32:49 +01:00
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