DST Address: The address that the application actually wants to request, address contains IP/domain and port
ATYP + IP/Domain + PORT
ATYP: 1 byte
IP/Domain: 4/n/16 bytes
Port: 2 bytes
KEY: AES key, 32 bytes
KEY: HKDF_SHA256(Password, Nonce, Info)
Password: User-defined passwordNonce: 12 bytesInfo: [0x62, 0x72, 0x6f, 0x6f, 0x6b]HKDF: Defined in RFC 5869
SHA256: Defined in FIPS 180-4
AES: Defined in U.S. Federal Information Processing Standards Publication 197
AES-GCM: Defined in RFC 5246, 5869
Client Nonce + [AES_GCM(Fragment Length) + AES_GCM(Fragment)]...
The maximum length of
AES_GCM(Fragment Length) + AES_GCM(Fragment)is 2048 bytes
Client Nonce: 12 bytes, randomly generated
1 to the first 8 bytes according to the Little Endian 64-bit unsigned integerFragment Length: Big Endian 16-bit unsigned integerFragment: Actual data being proxied
The first Fragment should be:
Unix Timestamp + DST Address
Unix Timestamp: If it is not even, it should be increased by 1. Big Endian 32-bit unsigned integerServer Nonce + [AES_GCM(Fragment Length) + AES_GCM(Fragment)]...
The maximum length of
AES_GCM(Fragment Length) + AES_GCM(Fragment)is 2048 bytes
1 to the first 8 bytes according to the Little Endian 64-bit unsigned integerFragment Length: Big Endian 16-bit unsigned integerFragment: Actual data being proxiedClient Nonce + AES_GCM(Fragment)
The maximum length of
Client Nonce + AES_GCM(Fragment)is 65507 bytes
Client Nonce: 12 bytes, randomly generated each timeFragment:
Unix Timestamp + DST Address + Data
Unix Timestamp: Big Endian 32-bit unsigned integerData: Actual data being proxiedServer Nonce + AES_GCM(Fragment)
The maximum length of
Server Nonce + AES_GCM(Fragment)is 65507 bytes
Server Nonce: 12 bytes, randomly generated each timeFragment:
DST Address + Data
Data: Actual data being proxiedClient Nonce + [AES_GCM(Fragment Length) + AES_GCM(Fragment)]...
The maximum length of
AES_GCM(Fragment Length) + AES_GCM(Fragment)is 65507 bytes, but the maximum length if the first one is 2048 bytes
Client Nonce: 12 bytes, randomly generated
1 to the first 8 bytes according to the Little Endian 64-bit unsigned integerFragment Length: Big Endian 16-bit unsigned integerFragment: Actual data being proxied
The first Fragment should be:
Unix Timestamp + DST Address
Unix Timestamp: If it is not odd, it should be increased by 1. Big Endian 32-bit unsigned integerServer Nonce + [AES_GCM(Fragment Length) + AES_GCM(Fragment)]...
The maximum length of
AES_GCM(Fragment Length) + AES_GCM(Fragment)is 65507 bytes
1 to the first 8 bytes according to the Little Endian 64-bit unsigned integerFragment Length: Big Endian 16-bit unsigned integerFragment: Actual data being proxied