Simple tls
This commit is contained in:
+1
-76
@@ -1,76 +1 @@
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
net::TcpStream,
|
||||
};
|
||||
|
||||
pub mod router;
|
||||
|
||||
pub type IpAddr = (u8, u8, u8, u8);
|
||||
|
||||
pub struct GhostClient(TcpStream);
|
||||
|
||||
impl GhostClient {
|
||||
pub fn connect(router: &str, host: IpAddr, port: u16) -> std::io::Result<Self> {
|
||||
let mut stream = TcpStream::connect(router)?;
|
||||
|
||||
let port = port.to_be_bytes();
|
||||
|
||||
stream.write_all(&[host.0, host.1, host.2, host.3, port[0], port[1]])?;
|
||||
|
||||
Ok(GhostClient(stream))
|
||||
}
|
||||
}
|
||||
|
||||
impl GhostClient {
|
||||
pub fn send(&mut self, buf: &[u8]) -> std::io::Result<()> {
|
||||
self.0.write_all(buf)
|
||||
}
|
||||
|
||||
pub fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
||||
self.0.read(buf)
|
||||
}
|
||||
|
||||
pub fn read_bytes(&mut self, size: usize) -> std::io::Result<Vec<u8>> {
|
||||
let mut buf = vec![0u8; size];
|
||||
let n = self.read(&mut buf)?;
|
||||
buf.truncate(n);
|
||||
Ok(buf)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn format_ip_bytes(buf: [u8; 6]) -> String {
|
||||
format!(
|
||||
"{}.{}.{}.{}:{}",
|
||||
buf[0],
|
||||
buf[1],
|
||||
buf[2],
|
||||
buf[3],
|
||||
u16::from_be_bytes([buf[4], buf[5]])
|
||||
)
|
||||
}
|
||||
|
||||
pub fn route_tcp(from: &mut TcpStream, to: &mut TcpStream) -> std::io::Result<bool> {
|
||||
let mut data = [0; 2048];
|
||||
|
||||
let bytes_read = from.read(&mut data)?;
|
||||
if bytes_read == 0 {
|
||||
return Ok(true);
|
||||
}
|
||||
|
||||
to.write_all(&data[..bytes_read])?;
|
||||
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
pub fn route_tcp2(from: &mut TcpStream, to: &mut TcpStream) -> std::io::Result<bool> {
|
||||
let mut data = [0; 2048];
|
||||
|
||||
let bytes_read = from.read(&mut data)?;
|
||||
if bytes_read == 0 {
|
||||
return Ok(true);
|
||||
}
|
||||
|
||||
to.write_all(&[&[0u8], &data[..bytes_read]].concat())?;
|
||||
|
||||
Ok(false)
|
||||
}
|
||||
pub fn request(gateway: &str) {}
|
||||
+41
-12
@@ -1,14 +1,43 @@
|
||||
use ghostnet_rs::GhostClient;
|
||||
// Cargo.toml dependencies:
|
||||
// rustls = "0.31"
|
||||
// rustls-native-certs = "0.8"
|
||||
|
||||
fn main() {
|
||||
// ghostnet_rs::router::router();
|
||||
let mut con = GhostClient::connect("0.0.0.0:443", (0, 0, 0, 0), 7525).unwrap();
|
||||
con.send("Hello from client!".as_bytes()).unwrap();
|
||||
let response = con.read_bytes(1024).unwrap();
|
||||
println!(
|
||||
"From server: {} ({response:?})",
|
||||
String::from_utf8(response.clone()).unwrap(),
|
||||
);
|
||||
// println!("From server 2: {:?}", con.read_bytes(1024).unwrap());
|
||||
// println!("From server 3: {:?}", con.read_bytes(1024).unwrap());
|
||||
use rustls::ClientConfig;
|
||||
use rustls::Stream;
|
||||
use rustls::client::ClientConnection;
|
||||
use rustls::server::CertificateType;
|
||||
use rustls_native_certs;
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
net::TcpStream,
|
||||
sync::Arc,
|
||||
};
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
// Load native certificates
|
||||
let certs = rustls_native_certs::load_native_certs()
|
||||
.expect("could not load platform certificate store");
|
||||
let mut root_store = rustls::RootCertStore::empty();
|
||||
for cert in certs {
|
||||
root_store.add(cert).unwrap();
|
||||
}
|
||||
|
||||
// Build TLS client config
|
||||
let config = ClientConfig::builder()
|
||||
// .with_safe_defaults()
|
||||
.with_root_certificates(root_store)
|
||||
.with_no_client_auth();
|
||||
|
||||
let arc_cfg = Arc::new(config);
|
||||
let server_name = "example.com".try_into()?;
|
||||
let mut conn = ClientConnection::new(arc_cfg, server_name)?;
|
||||
let mut tcp = TcpStream::connect("example.com:443")?;
|
||||
let mut tls = Stream::new(&mut conn, &mut tcp);
|
||||
|
||||
tls.write_all(b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")?;
|
||||
let mut resp = Vec::new();
|
||||
tls.read_to_end(&mut resp)?;
|
||||
println!("{}", String::from_utf8_lossy(&resp));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
use std::{
|
||||
io::{Read, Write},
|
||||
net::{TcpListener, TcpStream},
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
use crate::{format_ip_bytes, route_tcp, route_tcp2};
|
||||
|
||||
pub fn router() {
|
||||
let server = TcpListener::bind("0.0.0.0:443").unwrap();
|
||||
let clients: Arc<Mutex<Vec<TcpStream>>> = Arc::new(Mutex::new(Vec::new()));
|
||||
|
||||
for stream in server.incoming() {
|
||||
match stream {
|
||||
Ok(mut client_recv) => {
|
||||
let clients = clients.clone();
|
||||
std::thread::spawn(move || {
|
||||
let mut addr = [0; 6];
|
||||
|
||||
client_recv.read_exact(&mut addr).unwrap();
|
||||
clients
|
||||
.lock()
|
||||
.unwrap()
|
||||
.push(client_recv.try_clone().unwrap());
|
||||
|
||||
let i = clients.lock().unwrap().len().wrapping_sub(2);
|
||||
|
||||
let mut using_router = false;
|
||||
|
||||
let mut server_recv = if let Some(server_recv) = clients.lock().unwrap().get(i)
|
||||
{
|
||||
server_recv.try_clone().unwrap()
|
||||
} else {
|
||||
using_router = true;
|
||||
TcpStream::connect(format_ip_bytes(addr)).unwrap()
|
||||
};
|
||||
|
||||
let mut server_send = server_recv.try_clone().unwrap();
|
||||
let mut client_send = client_recv.try_clone().unwrap();
|
||||
|
||||
if using_router {
|
||||
std::thread::spawn(move || {
|
||||
while !route_tcp(&mut client_recv, &mut server_send).unwrap() {}
|
||||
});
|
||||
|
||||
while !route_tcp(&mut server_recv, &mut client_send).unwrap() {}
|
||||
} else {
|
||||
server_send
|
||||
.write_all(&[&[1u8], &addr[..]].concat())
|
||||
.unwrap();
|
||||
|
||||
std::thread::spawn(move || {
|
||||
while !route_tcp2(&mut client_recv, &mut server_send).unwrap() {}
|
||||
});
|
||||
|
||||
while !route_tcp2(&mut server_recv, &mut client_send).unwrap() {}
|
||||
}
|
||||
});
|
||||
}
|
||||
Err(_) => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user