add some basoc logic

This commit is contained in:
PoliEcho 2025-07-28 17:12:47 +02:00
parent 63d485b8b5
commit 72703aa46b

View File

@ -1,13 +1,11 @@
mod net; mod net;
use pea_2_pea::*; mod types;
use pea_2_pea::{shared::crypto::derive_key_from_password, *};
use rand::RngCore; use rand::RngCore;
use std::{ use std::{net::UdpSocket, process::exit, time::Duration};
io::{Error, ErrorKind, Read, Write},
net::UdpSocket, use crate::types::Network;
process::exit,
time::Duration,
};
#[derive(clap::Parser)] #[derive(clap::Parser)]
#[command(name = "pea_2_pea")] #[command(name = "pea_2_pea")]
@ -70,13 +68,80 @@ fn main() -> std::io::Result<()> {
let mut buf: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]; let mut buf: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
// query here // query here
let mut data_lenght: usize = net::query_request(&mut buf, &server_SocketAddr, socket)?; let public_sock_addr_raw: String =
match net::query_request(&mut buf, &server_SocketAddr, &socket) {
Ok(s) => s,
Err(e) => return Err(ServerErrorResponses::into_io_error(e)),
};
let mut public_sock_addr: Vec<u8> = buf[1..data_lenght].to_vec(); let mut salt: [u8; SALT_AND_IV_SIZE] = [0u8; SALT_AND_IV_SIZE];
let mut iv: [u8; SALT_AND_IV_SIZE] = [0u8; SALT_AND_IV_SIZE];
let (public_sock_addr, encryption_key) = match cli.password {
Some(ref p) => {
let mut rng = rand::rng();
rng.fill_bytes(&mut salt);
rng.fill_bytes(&mut iv);
let enc_key_tmp = shared::crypto::derive_key_from_password(p.as_bytes(), &salt);
(
shared::crypto::encrypt(&enc_key_tmp, &iv, public_sock_addr_raw.as_bytes())
.unwrap()
.into_boxed_slice(),
enc_key_tmp,
)
}
None => (
public_sock_addr_raw.as_bytes().to_vec().into_boxed_slice(),
[0u8; 32],
),
};
// register network let virtual_network: Network = {
match net::get_request(
let mut salt: Option<[u8; SALT_AND_IV_SIZE as usize]>; &mut buf,
&server_SocketAddr,
&socket,
&cli.network_id,
&cli.password,
) {
Ok(n) => {
let _ = net::send_heartbeat(
&mut buf,
&server_SocketAddr,
&socket,
&n,
&public_sock_addr,
&iv,
);
n
}
Err(e) if e.kind() == ServerResponse::ID_DOESNT_EXIST => {
let tmp_v_net: Network = Network::new(
match cli.password {
Some(_) => true,
None => false,
},
encryption_key,
cli.network_id,
salt,
Vec::with_capacity(1),
);
net::register_request(
&mut buf,
&server_SocketAddr,
&socket,
&tmp_v_net,
&public_sock_addr,
&iv,
)
.unwrap();
tmp_v_net
}
Err(e) => {
eprintln!("Failed to get data from server. Reason: {}", e);
exit(5); //EIO
}
}
};
} }
Ok(()) Ok(())
} }