mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-11-29 06:41:33 +03:00
Cedar: implement UDP acceleration version 2, powered by ChaCha20-Poly1305
This commit is contained in:
@ -9,9 +9,14 @@
|
||||
#define UDPACCEL_H
|
||||
|
||||
// Constants
|
||||
#define UDP_ACCELERATION_COMMON_KEY_SIZE 20 // Common key size
|
||||
#define UDP_ACCELERATION_PACKET_KEY_SIZE 20 // Key size for the packet
|
||||
#define UDP_ACCELERATION_PACKET_IV_SIZE 20 // IV size for the packet
|
||||
#define UDP_ACCELERATION_COMMON_KEY_SIZE_V1 20 // V1: Common key size
|
||||
#define UDP_ACCELERATION_PACKET_KEY_SIZE_V1 20 // V1: Key size for the packet
|
||||
#define UDP_ACCELERATION_PACKET_IV_SIZE_V1 20 // V1: IV size for the packet
|
||||
|
||||
#define UDP_ACCELERATION_COMMON_KEY_SIZE_V2 128 // V2: Common key size
|
||||
#define UDP_ACCELERATION_PACKET_IV_SIZE_V2 12 // V2: IV size for the packet
|
||||
#define UDP_ACCELERATION_PACKET_MAC_SIZE_V2 16 // V2: MAC size for the packet
|
||||
|
||||
#define UDP_ACCELERATION_TMP_BUF_SIZE 2048 // Temporary buffer size
|
||||
#define UDP_ACCELERATION_WINDOW_SIZE_MSEC (30 * 1000) // Receive window size (in milliseconds)
|
||||
|
||||
@ -45,8 +50,10 @@ struct UDP_ACCEL
|
||||
bool ClientMode; // Whether client mode
|
||||
bool IsInCedarPortList; // Whether included in the port list of the Cedar
|
||||
UINT64 Now; // Current time
|
||||
UCHAR MyKey[UDP_ACCELERATION_COMMON_KEY_SIZE]; // Submit-direction common key
|
||||
UCHAR YourKey[UDP_ACCELERATION_COMMON_KEY_SIZE]; // Receiving-direction common key
|
||||
CIPHER *CipherEncrypt; // Encryption context
|
||||
CIPHER *CipherDecrypt; // Decryption context
|
||||
UCHAR MyKey[UDP_ACCELERATION_COMMON_KEY_SIZE_V1]; // Send-direction common key
|
||||
UCHAR YourKey[UDP_ACCELERATION_COMMON_KEY_SIZE_V1]; // Receive-direction common key
|
||||
SOCK *UdpSock; // UDP socket
|
||||
UINT MyPort; // My port number
|
||||
UINT YourPort; // Port number of the other party
|
||||
@ -63,7 +70,7 @@ struct UDP_ACCEL
|
||||
UINT64 LastSetSrcIpAndPortTick; // Opponent's tick ??value at the time of storing the IP address and port number of the opponent at the end
|
||||
UINT64 LastRecvTick; // Tick when data has received at the end
|
||||
UINT64 NextSendKeepAlive; // Next time to send a KeepAlive packet
|
||||
UCHAR NextIv[UDP_ACCELERATION_PACKET_IV_SIZE]; // IV to be used next
|
||||
UCHAR NextIv[UDP_ACCELERATION_PACKET_IV_SIZE_V1]; // IV to be used next
|
||||
UINT MyCookie; // My cookie
|
||||
UINT YourCookie; // Cookie of the other party
|
||||
bool Inited; // Initialized flag
|
||||
@ -94,6 +101,10 @@ struct UDP_ACCEL
|
||||
UCHAR UdpIpQueryPacketData[16]; // Query packet data (final transmission)
|
||||
UINT UdpIpQueryPacketSize; // Query packet data size (final transmission)
|
||||
UCHAR UdpHostUniqueKey[SHA1_SIZE]; // Unique key for UDP self endpoint query
|
||||
UINT Version; // Version
|
||||
UCHAR MyKey_V2[UDP_ACCELERATION_COMMON_KEY_SIZE_V2]; // Send-direction common key (version 2)
|
||||
UCHAR NextIv_V2[UDP_ACCELERATION_PACKET_IV_SIZE_V2]; // IV to be used next (version 2)
|
||||
bool ReadRawFlagMode; // Read raw flag mode
|
||||
};
|
||||
|
||||
// Function prototype
|
||||
@ -104,9 +115,9 @@ bool UdpAccelInitServer(UDP_ACCEL *a, UCHAR *client_key, IP *client_ip, UINT cli
|
||||
void UdpAccelPoll(UDP_ACCEL *a);
|
||||
void UdpAccelSetTick(UDP_ACCEL *a, UINT64 tick64);
|
||||
BLOCK *UdpAccelProcessRecvPacket(UDP_ACCEL *a, UCHAR *buf, UINT size, IP *src_ip, UINT src_port);
|
||||
void UdpAccelCalcKey(UCHAR *key, UCHAR *common_key, UCHAR *iv);
|
||||
void UdpAccelCalcKeyV1(UCHAR *key, UCHAR *common_key, UCHAR *iv);
|
||||
bool UdpAccelIsSendReady(UDP_ACCEL *a, bool check_keepalive);
|
||||
void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, bool compressed, UINT max_size, bool high_priority);
|
||||
void UdpAccelSend(UDP_ACCEL *a, UCHAR *data, UINT data_size, UCHAR flag, UINT max_size, bool high_priority);
|
||||
void UdpAccelSendBlock(UDP_ACCEL *a, BLOCK *b);
|
||||
UINT UdpAccelCalcMss(UDP_ACCEL *a);
|
||||
void NatT_GetIpThread(THREAD *thread, void *param);
|
||||
|
||||
Reference in New Issue
Block a user