added encrypt encode and decode
This commit is contained in:
parent
ecf99847eb
commit
46d44e9f96
@ -61,13 +61,26 @@ impl<'a> Common<'a> {
|
|||||||
};
|
};
|
||||||
Ok((common, &value[5 + id_len..]))
|
Ok((common, &value[5 + id_len..]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new(id: &'a str) -> Self {
|
||||||
|
return Common {
|
||||||
|
id,
|
||||||
|
version: 1,
|
||||||
|
ttl: 2,
|
||||||
|
pc: PacketType::PKTInvalid,
|
||||||
|
flags: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr)]
|
#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum PacketType {
|
pub enum PacketType {
|
||||||
PKTInvalid,
|
PKTInvalid,
|
||||||
|
// 向sn注册
|
||||||
PKTRegisterSuper,
|
PKTRegisterSuper,
|
||||||
|
// 数据转发
|
||||||
|
PKTPacket,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::convert::From<u8> for PacketType {
|
impl std::convert::From<u8> for PacketType {
|
||||||
@ -75,6 +88,7 @@ impl std::convert::From<u8> for PacketType {
|
|||||||
match value {
|
match value {
|
||||||
// 0 => Self::PacketInvalid,
|
// 0 => Self::PacketInvalid,
|
||||||
1 => Self::PKTRegisterSuper,
|
1 => Self::PKTRegisterSuper,
|
||||||
|
2 => Self::PKTPacket,
|
||||||
_ => Self::PKTInvalid,
|
_ => Self::PKTInvalid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,6 +99,7 @@ impl PacketType {
|
|||||||
match *self {
|
match *self {
|
||||||
Self::PKTInvalid => 0,
|
Self::PKTInvalid => 0,
|
||||||
Self::PKTRegisterSuper => 1,
|
Self::PKTRegisterSuper => 1,
|
||||||
|
Self::PKTPacket => 2,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,6 +129,29 @@ mod test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn encode_packet_encrypted<T: serde::Serialize>(
|
||||||
|
cmn: &Common,
|
||||||
|
pkt: &T,
|
||||||
|
header_pass: &[u8],
|
||||||
|
) -> Result<Vec<u8>> {
|
||||||
|
let hdr = cmn.encode();
|
||||||
|
let body = serde_json::to_vec(pkt)?;
|
||||||
|
let body = aes_encrypt(header_pass, &body)?;
|
||||||
|
|
||||||
|
let mut result = Vec::with_capacity(4 + hdr.len() + body.len());
|
||||||
|
let total_size = (2 + hdr.len() + body.len()) as u16;
|
||||||
|
// insert total size
|
||||||
|
result.extend_from_slice(&total_size.to_be_bytes());
|
||||||
|
// packet_id
|
||||||
|
result.extend_from_slice(&[0, 0]);
|
||||||
|
// insert header
|
||||||
|
result.extend_from_slice(&hdr);
|
||||||
|
// insert body
|
||||||
|
result.extend_from_slice(&body);
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn encode_packet<T: serde::Serialize>(cmn: &Common, pkt: &T) -> Result<Vec<u8>> {
|
pub fn encode_packet<T: serde::Serialize>(cmn: &Common, pkt: &T) -> Result<Vec<u8>> {
|
||||||
// header
|
// header
|
||||||
let hdr = cmn.encode();
|
let hdr = cmn.encode();
|
||||||
@ -134,7 +172,8 @@ pub fn encode_packet<T: serde::Serialize>(cmn: &Common, pkt: &T) -> Result<Vec<u
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn decode_packet<'a, T: serde::Deserialize<'a>>(value: &'a [u8]) -> Result<(Common<'a>, T)> {
|
// decode the common, and return the encrypted bytes;
|
||||||
|
pub fn decode_common<'a>(value: &'a [u8]) -> Result<(Common<'a>, &'a [u8])> {
|
||||||
if value.len() < 4 {
|
if value.len() < 4 {
|
||||||
return Err(SDLanError::NormalError("decode pkt length error"));
|
return Err(SDLanError::NormalError("decode pkt length error"));
|
||||||
}
|
}
|
||||||
@ -146,6 +185,14 @@ pub fn decode_packet<'a, T: serde::Deserialize<'a>>(value: &'a [u8]) -> Result<(
|
|||||||
|
|
||||||
let value2 = &value[4..2 + size as usize];
|
let value2 = &value[4..2 + size as usize];
|
||||||
let (cmn, value2) = Common::from_slice(value2)?;
|
let (cmn, value2) = Common::from_slice(value2)?;
|
||||||
|
Ok((cmn, value2))
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode the whole packet, suitable for un-encrypted packet info
|
||||||
|
pub fn decode_packet<'a, T: serde::Deserialize<'a>>(value: &'a [u8]) -> Result<(Common<'a>, T)> {
|
||||||
|
// let value2 = &value[4..2 + size as usize];
|
||||||
|
let (cmn, value2) = decode_common(value)?;
|
||||||
|
// let (cmn, value2) = Common::from_slice(value2)?;
|
||||||
let res = serde_json::from_slice(value2)?;
|
let res = serde_json::from_slice(value2)?;
|
||||||
Ok((cmn, res))
|
Ok((cmn, res))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,9 +22,13 @@ pub struct RegisterSuper<'a> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use crate::config;
|
use crate::config;
|
||||||
|
use crate::packet::decode_common;
|
||||||
use crate::packet::decode_packet;
|
use crate::packet::decode_packet;
|
||||||
use crate::packet::encode_packet;
|
use crate::packet::encode_packet;
|
||||||
|
use crate::packet::encode_packet_encrypted;
|
||||||
use crate::packet::PacketType;
|
use crate::packet::PacketType;
|
||||||
|
use crate::utils::aes_decrypt;
|
||||||
|
use crate::utils::gen_uuid;
|
||||||
|
|
||||||
use self::peer::SdlanSock;
|
use self::peer::SdlanSock;
|
||||||
use crate::packet::Common;
|
use crate::packet::Common;
|
||||||
@ -32,7 +36,7 @@ mod test {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
fn do_encode() -> Result<(Vec<u8>, Common<'static>, RegisterSuper<'static>)> {
|
fn prepare_data() -> (Common<'static>, RegisterSuper<'static>) {
|
||||||
let cmn1 = Common {
|
let cmn1 = Common {
|
||||||
version: 1,
|
version: 1,
|
||||||
id: "asxalex",
|
id: "asxalex",
|
||||||
@ -54,10 +58,23 @@ mod test {
|
|||||||
pub_key: "public key",
|
pub_key: "public key",
|
||||||
token: "user's token",
|
token: "user's token",
|
||||||
};
|
};
|
||||||
|
(cmn1, pkt1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn do_encode() -> Result<(Vec<u8>, Common<'static>, RegisterSuper<'static>)> {
|
||||||
|
let (cmn1, pkt1) = prepare_data();
|
||||||
let res = encode_packet(&cmn1, &pkt1).unwrap();
|
let res = encode_packet(&cmn1, &pkt1).unwrap();
|
||||||
Ok((res, cmn1, pkt1))
|
Ok((res, cmn1, pkt1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn do_encode_encrypted(
|
||||||
|
pass: &[u8],
|
||||||
|
) -> Result<(Vec<u8>, Common<'static>, RegisterSuper<'static>)> {
|
||||||
|
let (cmn1, pkt1) = prepare_data();
|
||||||
|
let res = encode_packet_encrypted(&cmn1, &pkt1, pass).unwrap();
|
||||||
|
Ok((res, cmn1, pkt1))
|
||||||
|
}
|
||||||
|
|
||||||
fn do_decode<'a, T: serde::Deserialize<'a>>(value: &'a [u8]) -> Result<(Common, T)> {
|
fn do_decode<'a, T: serde::Deserialize<'a>>(value: &'a [u8]) -> Result<(Common, T)> {
|
||||||
decode_packet(value)
|
decode_packet(value)
|
||||||
}
|
}
|
||||||
@ -100,4 +117,17 @@ mod test {
|
|||||||
let (cmn2, pkt2) = do_decode::<RegisterSuper>(&value).unwrap();
|
let (cmn2, pkt2) = do_decode::<RegisterSuper>(&value).unwrap();
|
||||||
compare_two(cmn1, cmn2, pkt1, pkt2);
|
compare_two(cmn1, cmn2, pkt1, pkt2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_encrypt_common_and_packet() -> Result<()> {
|
||||||
|
let pass = gen_uuid().into_bytes();
|
||||||
|
let (data, cmn1, pkt1) = do_encode_encrypted(&pass)?;
|
||||||
|
|
||||||
|
let (cmn2, encryptedinfo) = decode_common(&data)?;
|
||||||
|
let jsonstr = aes_decrypt(&pass, encryptedinfo)?;
|
||||||
|
let pkt2: RegisterSuper = serde_json::from_slice(&jsonstr)?;
|
||||||
|
|
||||||
|
compare_two(cmn1, cmn2, pkt1, pkt2);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -109,9 +109,9 @@ impl IpSubnet {
|
|||||||
#[derive(Debug, Serialize, Deserialize, PartialEq, sqlx::FromRow)]
|
#[derive(Debug, Serialize, Deserialize, PartialEq, sqlx::FromRow)]
|
||||||
pub struct SdlanSock {
|
pub struct SdlanSock {
|
||||||
pub family: u8,
|
pub family: u8,
|
||||||
pub port: u32,
|
pub port: u16,
|
||||||
pub has_v6: bool,
|
pub has_v6: bool,
|
||||||
pub v6_port: u32,
|
pub v6_port: u16,
|
||||||
// pub v4: Vec<u8>,
|
// pub v4: Vec<u8>,
|
||||||
// pub v6: Vec<u8>,
|
// pub v6: Vec<u8>,
|
||||||
#[sqlx(try_from = "Vec<u8>")]
|
#[sqlx(try_from = "Vec<u8>")]
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
|
use super::SDLanError;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
|
use std::net::{IpAddr, SocketAddr};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::sync::mpsc::UnboundedReceiver;
|
|
||||||
|
|
||||||
pub struct MyDashMap<T>(DashMap<String, Arc<T>>);
|
pub struct MyDashMap<T>(DashMap<String, Arc<T>>);
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ pub fn get_current_timestamp() -> u64 {
|
|||||||
.as_secs()
|
.as_secs()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::peer::SdlanSock;
|
||||||
|
|
||||||
use super::{gen_uuid, Result};
|
use super::{gen_uuid, Result};
|
||||||
use std::fs::{File, OpenOptions};
|
use std::fs::{File, OpenOptions};
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
@ -59,3 +62,24 @@ pub fn create_or_load_uuid() -> Result<String> {
|
|||||||
return Ok(uuid);
|
return Ok(uuid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get sdlansock info from socketaddr
|
||||||
|
pub fn get_sdlan_sock_from_socketaddr(addr: SocketAddr) -> Result<SdlanSock> {
|
||||||
|
let port = addr.port();
|
||||||
|
let ip = addr.ip();
|
||||||
|
match ip {
|
||||||
|
IpAddr::V4(ipv4) => {
|
||||||
|
let v4: u32 = ipv4.into();
|
||||||
|
let res = SdlanSock {
|
||||||
|
family: 0,
|
||||||
|
port: port,
|
||||||
|
has_v6: false,
|
||||||
|
v6_port: 0,
|
||||||
|
v4: v4.to_be_bytes(),
|
||||||
|
v6: [0; 16],
|
||||||
|
};
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
IpAddr::V6(_ipv6) => Err(SDLanError::NormalError("ipv6 found")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user