From 002a66783731e13c8d737454c47824135135c46c Mon Sep 17 00:00:00 2001 From: TIBERGHIEN corentin Date: Tue, 16 Dec 2025 22:43:49 +0100 Subject: [PATCH] enregistrement avec serveur --- Cargo.lock | 887 ++++++++++++++++++++++++++++++++- client-network/Cargo.toml | 9 + client-network/src/lib.rs | 1 + client-network/src/protocol.rs | 49 ++ project.pdf | Bin 0 -> 79510 bytes todo.md | 32 ++ 6 files changed, 968 insertions(+), 10 deletions(-) create mode 100644 project.pdf create mode 100644 todo.md diff --git a/Cargo.lock b/Cargo.lock index c4cbb04..856b9f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,7 +121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -403,6 +403,24 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + [[package]] name = "bit-set" version = "0.8.0" @@ -603,7 +621,7 @@ checksum = "99cbf41c6ec3c4b9eaf7f8f5c11a72cd7d3aa0428125c20d5ef4d09907a0f019" dependencies = [ "cfg-if", "cpufeatures", - "rand_core", + "rand_core 0.10.0-rc-2", ] [[package]] @@ -622,9 +640,18 @@ dependencies = [ name = "client-network" version = "0.1.0" dependencies = [ + "bytes", "crossbeam-channel", + "ecdsa", + "getrandom 0.3.4", "hex", + "http", + "os-rng", + "p256", "rand", + "rand_core 0.6.4", + "rand_os", + "reqwest", "sha2", "tokio", ] @@ -668,6 +695,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "core-foundation" version = "0.9.4" @@ -703,7 +736,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -768,6 +801,18 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -784,6 +829,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -791,7 +847,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -851,6 +909,20 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ecolor" version = "0.33.2" @@ -973,6 +1045,26 @@ dependencies = [ "winit", ] +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "emath" version = "0.33.2" @@ -982,6 +1074,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "endi" version = "1.1.1" @@ -1111,6 +1212,16 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -1127,6 +1238,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foldhash" version = "0.1.5" @@ -1139,6 +1256,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1146,7 +1272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1160,6 +1286,12 @@ dependencies = [ "syn", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -1175,6 +1307,15 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + [[package]] name = "futures-core" version = "0.3.31" @@ -1211,6 +1352,12 @@ dependencies = [ "syn", ] +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + [[package]] name = "futures-task" version = "0.3.31" @@ -1239,6 +1386,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1251,6 +1399,28 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -1403,6 +1573,36 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" @@ -1451,6 +1651,134 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + [[package]] name = "icu_collections" version = "2.1.1" @@ -1577,6 +1905,28 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "jni" version = "0.21.1" @@ -1605,7 +1955,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.4", "libc", ] @@ -1750,12 +2100,18 @@ dependencies = [ "bitflags 2.10.0", "block", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1773,7 +2129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.61.2", ] @@ -1813,6 +2169,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2180,6 +2553,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "orbclient" version = "0.3.49" @@ -2208,6 +2625,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "os-rng" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f696cae8a7a22df7114422a2bd7029a9f5654f23a14d975e70b70e9750ad60" + [[package]] name = "owned_ttf_parser" version = "0.25.1" @@ -2217,6 +2640,18 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parking" version = "2.2.1" @@ -2252,6 +2687,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2301,6 +2745,16 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2364,6 +2818,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -2444,8 +2907,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be866deebbade98028b705499827ad6967c8bb1e21f96a2609913c8c076e9307" dependencies = [ "chacha20", - "getrandom", - "rand_core", + "getrandom 0.3.4", + "rand_core 0.10.0-rc-2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", ] [[package]] @@ -2454,6 +2935,16 @@ version = "0.10.0-rc-2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "104a23e4e8b77312a823b6b5613edbac78397e2f34320bc7ac4277013ec4478e" +[[package]] +name = "rand_os" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a788ae3edb696cfcba1c19bfd388cc4b8c21f8a408432b199c072825084da58a" +dependencies = [ + "getrandom 0.1.16", + "rand_core 0.5.1", +] + [[package]] name = "range-alloc" version = "0.1.4" @@ -2490,6 +2981,70 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2528,12 +3083,51 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "same-file" version = "1.0.6" @@ -2543,6 +3137,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -2568,6 +3171,43 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.228" @@ -2598,6 +3238,19 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + [[package]] name = "serde_repr" version = "0.1.20" @@ -2609,6 +3262,18 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha2" version = "0.10.9" @@ -2635,6 +3300,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -2753,6 +3428,16 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -2771,6 +3456,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.111" @@ -2782,6 +3473,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -2793,6 +3493,27 @@ dependencies = [ "syn", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.23.0" @@ -2800,7 +3521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.3.4", "once_cell", "rustix 1.1.2", "windows-sys 0.61.2", @@ -2932,6 +3653,39 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml_datetime" version = "0.7.3" @@ -2962,6 +3716,51 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -2994,6 +3793,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "ttf-parser" version = "0.25.1" @@ -3044,6 +3849,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.7" @@ -3073,6 +3884,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" @@ -3089,6 +3906,21 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -3656,6 +4488,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.2.0" @@ -3674,6 +4517,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-strings" version = "0.1.0" @@ -3693,6 +4545,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -4231,6 +5092,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/client-network/Cargo.toml b/client-network/Cargo.toml index 2906cd6..3e700d7 100644 --- a/client-network/Cargo.toml +++ b/client-network/Cargo.toml @@ -9,3 +9,12 @@ tokio = { version = "1", features = ["full"] } rand = "0.10.0-rc.5" hex = "0.4.3" sha2 = "0.10.9" +ecdsa = "0.16.9" +getrandom = "0.3.4" +p256 = "0.13.2" +rand_core = "0.6" +os-rng = "0.0.0" +rand_os = "0.2.2" +http = "1.4.0" +reqwest = "0.12.24" +bytes = "1.11.0" diff --git a/client-network/src/lib.rs b/client-network/src/lib.rs index 8801e0d..0b56579 100644 --- a/client-network/src/lib.rs +++ b/client-network/src/lib.rs @@ -1,4 +1,5 @@ mod data; +mod protocol; /// Messages sent to the Network thread by the GUI. pub enum NetworkCommand { diff --git a/client-network/src/protocol.rs b/client-network/src/protocol.rs index e69de29..627f40e 100644 --- a/client-network/src/protocol.rs +++ b/client-network/src/protocol.rs @@ -0,0 +1,49 @@ +use http::{Request, Response}; +use p256::ecdsa::{ + Signature, SigningKey, VerifyingKey, + signature::{Signer, Verifier}, +}; +use rand_core::OsRng; + +struct KeyRegistration { + priv_key: SigningKey, + pub_key: VerifyingKey, + username: String, +} + +impl KeyRegistration { + fn new(username: String) -> KeyRegistration { + let priv_key = SigningKey::random(&mut OsRng); + let pub_key = VerifyingKey::from(&priv_key); + KeyRegistration { + priv_key: priv_key, + pub_key: pub_key, + username: username, + } + } +} + +async fn register_with_the_server(key: KeyRegistration) -> Result { + let client = reqwest::Client::new(); + + let pubkey_ser = key.pub_key.to_encoded_point(false); + let pubkey_str = hex::encode(pubkey_ser); + let uri = format!("https://jch.irif.fr:8443/peers/{}/key", key.username); + let resp = client.put(uri).send().await?.error_for_status()?; + + resp.bytes().await +} + +/*#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn key_genereation() { + let keys = KeyRegistration::new(); + let pubkey = keys.pub_key; + let pubkey_ser = pubkey.to_encoded_point(false); + println!("string pubkey: {}", hex::encode(pubkey_ser)); + println!("string privkey: {}", hex::encode(keys.priv_key.to_bytes())) + } +}*/ diff --git a/project.pdf b/project.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b9eea43ed5a0d924e88488c34c796b7f2438b6b GIT binary patch literal 79510 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 F{0B*=J&phX literal 0 HcmV?d00001 diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..09e5375 --- /dev/null +++ b/todo.md @@ -0,0 +1,32 @@ +# Todo : +## peer discovery +- get rsquest to the uri /peers/ + +## registration with the server +- generation of the cryptographic key +- put request to the uri (check if the peer is already connected) OK +- get request to the uri /peers/key to get the public key of a peer +- get request to the uri /peers/key/addresses + +## handshake +- handshake structure +- 5min timeout after handshake +- matain connection every 4 min + +## data transfer +- request structure +- root/root reply structure +- datum/nodatum and datum structures +- nattraversal 1 and 2 structures +- setting in gui to act as a relay +- chunk, directory, big, bigdirectory structures + +fonctionnalités : + +s'enregistrer avec le serveur OK +rechercher un pair +generer une clé publique +rechercher les fichiers d'un pair +telechargement des fichiers +choisir un dossier à partager +se deconnecter du réseau