diff --git a/python/generate_data.py b/python/generate_data.py index 5c7c280..474dc3d 100644 --- a/python/generate_data.py +++ b/python/generate_data.py @@ -1,9 +1,9 @@ import secrets -rndsize = 488*500+5 +rndsize = 2**24 rndbytes = secrets.token_bytes(rndsize) open('files/data.bin', 'wb').write(rndbytes) -print('data.bin generated with size %d bytes' % rndsize) \ No newline at end of file +print('data.bin generated with size %d bytes' % rndsize) diff --git a/rust/client/Cargo.lock b/rust/client/Cargo.lock index 0078759..3cb1db5 100644 --- a/rust/client/Cargo.lock +++ b/rust/client/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "bincode" version = "1.3.3" @@ -80,6 +86,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "itransfer_client" version = "0.1.0" @@ -87,6 +104,8 @@ dependencies = [ "bincode", "byteorder", "crc32fast", + "num-bigint", + "rand", "serde", "sha2", ] @@ -97,6 +116,42 @@ version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.58" @@ -115,6 +170,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "serde" version = "1.0.163" @@ -174,3 +259,9 @@ name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/rust/client/Cargo.toml b/rust/client/Cargo.toml index 71689a2..bc9e37c 100644 --- a/rust/client/Cargo.toml +++ b/rust/client/Cargo.toml @@ -11,6 +11,8 @@ serde = { version = "1.0.163", features = ["serde_derive"], default-features = f byteorder = { default-features = false, version = "1.4.3" } sha2 = { default-features = false, version = "0.10.6" } crc32fast = { default-features = false, version = "1.3.2" } +rand = { default-features = true, features = ["std_rng"], version = "0.8.5" } +num-bigint = { default-features = true, version = "0.4.3" } [profile.release] lto = true # Enable link-time optimization diff --git a/rust/client/src/main.rs b/rust/client/src/main.rs index 128f197..8558883 100644 --- a/rust/client/src/main.rs +++ b/rust/client/src/main.rs @@ -1,9 +1,10 @@ use bincode::{self, Error, options, Options}; -use std::{net::{UdpSocket, SocketAddr}, io::Write}; +use std::{net::{UdpSocket, SocketAddr}, io::{Write, BufRead, self}}; use serde::{Serialize, Deserialize}; use sha2::{Digest, Sha512}; -use std::io::{self, BufRead}; use crc32fast; +use rand::{rngs::StdRng, RngCore, SeedableRng}; +use num_bigint::BigUint; mod big_array; use big_array::BigArray; @@ -42,8 +43,25 @@ fn read_stdin(message: String) -> String { buffer.trim().to_string() } +fn pow_mod(num: BigUint, pow: BigUint, modulo: BigUint) -> BigUint { + let mut result = BigUint::from(1u8); + let one = BigUint::from(1u8); + let mut i = BigUint::from(0u8); + while i < pow { + result = (result * &num) % &modulo; + i += &one; + } + + result +} + fn main() { + let mut randomgen = StdRng::from_entropy(); + let mut private_key = [0u8; 4096]; + randomgen.fill_bytes(&mut private_key); + let private_key = BigUint::from_bytes_be(&private_key); + let timeout = 1; let mut server_ip = read_stdin("Enter server ip: ".to_string());//e.g. 213.47.107.152:1337 if server_ip == "" { @@ -119,119 +137,122 @@ fn main() { let mut server_hash = [0u8; 64]; let mut server_hash_received = false; - //receive the packets - while received_packets < packet_info.packet_numbers-1 || !server_hash_received { - let mut buffer = [0u8; MAX_FRAME_PAYLOAD_U]; - let res = socket.recv_from(&mut buffer); - if let Ok((received_bytes, remote_addr)) = res { - let filled_buffer = &buffer;//[..received_bytes]; + loop { + //receive the packets + while received_packets < packet_info.packet_numbers-1 || !server_hash_received { + let mut buffer = [0u8; MAX_FRAME_PAYLOAD_U]; + let res = socket.recv_from(&mut buffer); + if let Ok((received_bytes, remote_addr)) = res { + let filled_buffer = &buffer;//[..received_bytes]; - //print the filled buffer - //println!("Received data: {:?} {}", filled_buffer, filled_buffer.len()); + //print the filled buffer + //println!("Received data: {:?} {}", filled_buffer, filled_buffer.len()); - if remote_addr != server_addr { - panic!("Received data from unknown address"); - } + if remote_addr != server_addr { + panic!("Received data from unknown address"); + } - if received_bytes == 65 { - //println!("Received hash packet, ignoring for now"); - server_hash = filled_buffer[0..64].try_into().expect("Failed to convert hash"); - //println!("Received hash: {:?}", server_hash); - server_hash_received = true; - continue; - } + if received_bytes == 65 { + //println!("Received hash packet, ignoring for now"); + server_hash = filled_buffer[0..64].try_into().expect("Failed to convert hash"); + //println!("Received hash: {:?}", server_hash); + server_hash_received = true; + continue; + } - if received_bytes != MAX_FRAME_PAYLOAD_U { - println!("Received packet with invalid size {} not {} | ignoring", received_bytes, MAX_FRAME_PAYLOAD_U); - continue; - } + if received_bytes != MAX_FRAME_PAYLOAD_U { + println!("Received packet with invalid size {} not {} | ignoring", received_bytes, MAX_FRAME_PAYLOAD_U); + continue; + } - let packet_result: Result = options.deserialize(filled_buffer); - let packet: Packet; - match packet_result { - Ok(p) => { - //println!("Packet {}", p.packet_number); - //check checksum with sum - if p.packet_number != packet_info.packet_numbers - 1 { - let hash = crc32fast::hash(&p.payload); + let packet_result: Result = options.deserialize(filled_buffer); + let packet: Packet; + match packet_result { + Ok(p) => { + //println!("Packet {}", p.packet_number); + //check checksum with sum + if p.packet_number != packet_info.packet_numbers - 1 { + let hash = crc32fast::hash(&p.payload); - if p.payload_hash != hash.to_be_bytes() { + if p.payload_hash != hash.to_be_bytes() { + continue; + } + packet_hashes[p.packet_number as usize] = p.payload_sum_hash; + + packet = p; + } else { + //cut packet down to size + packets[p.packet_number as usize] = p.payload[..packet_info.last_packet_size as usize].to_vec(); continue; } - packet_hashes[p.packet_number as usize] = p.payload_sum_hash; - - packet = p; - } else { - //cut packet down to size - packets[p.packet_number as usize] = p.payload[..packet_info.last_packet_size as usize].to_vec(); - continue; + } + Err(err) => { + panic!("Failed to deserialize data: {}", err); } } - Err(err) => { - panic!("Failed to deserialize data: {}", err); + + if packets[packet.packet_number as usize].len() != 0 { + //println!("Packet already received, ignoring"); + continue; } - } - if packets[packet.packet_number as usize].len() != 0 { - //println!("Packet already received, ignoring"); - continue; - } - - packets[packet.packet_number as usize] = packet.payload.to_vec(); - received_packets += 1; - } else { - //println!("Timeout, requesting again {}/{}\r", received_packets, packet_info.packet_numbers); - //collect packets that were not received and send them in n messages - //where n is the minimum amount of messages needed to request all packets - let mut missing_packets: Vec = Vec::new(); - for i in 0..packet_info.packet_numbers { - if packets[i as usize].len() == 0 { - missing_packets.push(i); + packets[packet.packet_number as usize] = packet.payload.to_vec(); + received_packets += 1; + } else { + //println!("Timeout, requesting again {}/{}\r", received_packets, packet_info.packet_numbers); + //collect packets that were not received and send them in n messages + //where n is the minimum amount of messages needed to request all packets + let mut missing_packets: Vec = Vec::new(); + for i in 0..packet_info.packet_numbers { + if packets[i as usize].len() == 0 { + missing_packets.push(i); + } } - } - //split lost_packets into groups of size 508-filename.len() bytes - let mut missing_packet_groups: Vec = Vec::new(); - let mut current_group: String = filename.to_string(); - for i in 0..missing_packets.len() { - if current_group.len() + missing_packets[i].to_string().len() + 1 > MAX_PAYLOAD_U { + //split lost_packets into groups of size 508-filename.len() bytes + let mut missing_packet_groups: Vec = Vec::new(); + let mut current_group: String = filename.to_string(); + for i in 0..missing_packets.len() { + if current_group.len() + missing_packets[i].to_string().len() + 1 > MAX_PAYLOAD_U { + missing_packet_groups.push(current_group); + current_group = filename.to_string(); + } + current_group.push('/'); + current_group.push_str(&missing_packets[i].to_string()); + } + + if current_group.len() > filename.len() { missing_packet_groups.push(current_group); - current_group = filename.to_string(); } - current_group.push('/'); - current_group.push_str(&missing_packets[i].to_string()); + + for i in 0..missing_packet_groups.len() { + let message = &missing_packet_groups[i]; + //println!("Requesting packets: {}", message); + socket.send_to(message.as_bytes(), server_addr).expect("Failed to send data"); + } + + if !server_hash_received { + let message = filename.to_string()+":"; + socket.send_to(message.as_bytes(), server_addr).expect("Failed to send data"); + } } - if current_group.len() > filename.len() { - missing_packet_groups.push(current_group); - } + print!("Packet {}/{}\r", received_packets, packet_info.packet_numbers); + } - for i in 0..missing_packet_groups.len() { - let message = &missing_packet_groups[i]; - //println!("Requesting packets: {}", message); - socket.send_to(message.as_bytes(), server_addr).expect("Failed to send data"); - } - - if !server_hash_received { - let message = filename.to_string()+":"; - socket.send_to(message.as_bytes(), server_addr).expect("Failed to send data"); + let mut crc32 = crc32fast::Hasher::new(); + for i in 0..packets.len() { + crc32.update(&packets[i]); + if packet_hashes[i] != crc32.clone().finalize() && packet_hashes[i] != 0 { + println!("Packet {} crc does not match, requesting again", i); + received_packets -= 1; + packet_hashes[i] = 0; + packets[i] = Vec::new(); } } - print!("Packet {}/{}\r", received_packets, packet_info.packet_numbers); - } - - let mut crc32 = crc32fast::Hasher::new(); - for i in 0..packets.len() { - crc32.update(&packets[i]); - if packet_hashes[i] != crc32.clone().finalize() && packet_hashes[i] != 0 { - println!("Packet {} crc does not match, writing .corrupt", i); - //TODO: Request packets again - let mut file = std::fs::File::create("received/".to_string()+filename+".corrupt").expect("Failed to create file"); - for i in 0..packets.len() { - file.write_all(&packets[i]).expect("Failed to write to file"); - } - return; + if received_packets == packet_info.packet_numbers-1 && server_hash_received { + break; } } diff --git a/rust/server/Cargo.lock b/rust/server/Cargo.lock index f8f8726..bd24377 100644 --- a/rust/server/Cargo.lock +++ b/rust/server/Cargo.lock @@ -11,6 +11,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "bincode" version = "1.3.3" @@ -96,6 +102,8 @@ dependencies = [ "bincode", "byteorder", "crc32fast", + "num-bigint", + "rand", "regex", "serde", "sha2", @@ -113,6 +121,42 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.59" @@ -131,6 +175,32 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "regex" version = "1.8.3" diff --git a/rust/server/Cargo.toml b/rust/server/Cargo.toml index a32987e..fe40cfc 100644 --- a/rust/server/Cargo.toml +++ b/rust/server/Cargo.toml @@ -12,6 +12,8 @@ byteorder = { default-features = false, version = "1.4.3" } sha2 = { default-features = false, version = "0.10.6" } regex = { default-features = true, version = "1.8.3" } crc32fast = { default-features = false, version = "1.3.2" } +rand = { default-features = false, features = ["std_rng"], version = "0.8.5" } +num-bigint = { default-features = true, version = "0.4.3" } [profile.release] lto = true # Enable link-time optimization diff --git a/rust/server/src/main.rs b/rust/server/src/main.rs index d7a9e0e..536c25a 100644 --- a/rust/server/src/main.rs +++ b/rust/server/src/main.rs @@ -4,6 +4,8 @@ use serde::{Serialize, Deserialize}; use sha2::{Digest,Sha512}; use regex::Regex; use crc32fast; +use rand::{rngs::StdRng, RngCore, SeedableRng}; +use num_bigint::BigUint; mod big_array; use big_array::BigArray; @@ -36,6 +38,18 @@ struct StrPacket { payload: [u8; MAX_PAYLOAD_U] } +fn pow_mod(num: BigUint, pow: BigUint, modulo: BigUint) -> BigUint { + let mut result = BigUint::from(1u8); + let one = BigUint::from(1u8); + let mut i = BigUint::from(0u8); + while i < pow { + result = (result * &num) % &modulo; + i += &one; + } + + result +} + fn main() { let port = "1337"; let timeout = 100; //ms