diff --git a/README.md b/README.md index 882109c..300ac0a 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Options: ✅ ✅ - + p2pcopy ✅ ✅ @@ -129,6 +129,15 @@ Options: ❌ ❌ + + qft + ✅ + ❌ + ❌ + ✅ + ❌ + ❌ + iwant ✅ @@ -205,6 +214,32 @@ Options: Open an [issue](https://github.com/manforowicz/gday/issues) to add more projects to this list. +## Technical Overview + +1. **Peer A** randomly generates a _"room code"_ and a _"shared secret"_. + +2. **Peer A** randomly selects a **gday server** ID and connects to it over TLS. + +3. **Peer A** sends its _room code_ and its local IP address and port number to the **gday server**. + +4. **Peer A** combines the server's ID, _room code_, and _shared secret_ into a code of form `"1.n5xn8.wvqsf"`. + +5. **Peer A** tells this code to **Peer B**, possibly via phone call or text message. + +6. **Peer B** also sends this _room code_ and its local IP address and port number to the **gday server**. + +7. The **gday server** sends both peers the public and local IP addresses and ports of the other peer. + +8. From the same local port that they used to connect to the server, each peer tries a few times to connect over TCP to both the local and public socket addresses of the other peer. + +9. Once any of the connection attempts succeeds, they use password-authenticated key exchange to derive a strong shared key from their _shared secret_, and use it to encrypt their TCP connection with chacha20poly1305. + +10. **Peer A** sends **Peer B** a list of offered files and their sizes. + +11. **Peer B** checks for files left over from any previous interrupted downloads, and replies with the file portions it would like to receive. + +12. **Peer A** sends all the accepted files to **Peer B**, back-to-back. + ## In this repository - [gday](/gday/) - Command line tool for sending files. diff --git a/gday/README.md b/gday/README.md index 50095a6..d672305 100644 --- a/gday/README.md +++ b/gday/README.md @@ -120,7 +120,7 @@ Options: ✅ ✅ - + p2pcopy ✅ ✅ @@ -129,6 +129,15 @@ Options: ❌ ❌ + + qft + ✅ + ❌ + ❌ + ✅ + ❌ + ❌ + iwant ✅ @@ -205,6 +214,32 @@ Options: Open an [issue](https://github.com/manforowicz/gday/issues) to add more projects to this list. +## Technical Overview + +1. **Peer A** randomly generates a _"room code"_ and a _"shared secret"_. + +2. **Peer A** randomly selects a **gday server** ID and connects to it over TLS. + +3. **Peer A** sends its _room code_ and its local IP address and port number to the **gday server**. + +4. **Peer A** combines the server's ID, _room code_, and _shared secret_ into a code of form `"1.n5xn8.wvqsf"`. + +5. **Peer A** tells this code to **Peer B**, possibly via phone call or text message. + +6. **Peer B** also sends this _room code_ and its local IP address and port number to the **gday server**. + +7. The **gday server** sends both peers the public and local IP addresses and ports of the other peer. + +8. From the same local port that they used to connect to the server, each peer tries a few times to connect over TCP to both the local and public socket addresses of the other peer. + +9. Once any of the connection attempts succeeds, they use password-authenticated key exchange to derive a strong shared key from their _shared secret_, and use it to encrypt their TCP connection with chacha20poly1305. + +10. **Peer A** sends **Peer B** a list of offered files and their sizes. + +11. **Peer B** checks for files left over from any previous interrupted downloads, and replies with the file portions it would like to receive. + +12. **Peer A** sends all the accepted files to **Peer B**, back-to-back. + ## Related - [gday](https://crates.io/crates/gday) - Command line tool for sending files. - [gday_server](https://crates.io/crates/gday_server) - Server that lets two peers share their socket addresses.