@@ -540,6 +540,80 @@ func TestHandlePacketResetsUnknownStreamData(t *testing.T) {
540540 }
541541}
542542
543+ func TestHandlePacketRespondsToSocks5Syn (t * testing.T ) {
544+ codec , err := security .NewCodec (0 , "" )
545+ if err != nil {
546+ t .Fatalf ("NewCodec returned error: %v" , err )
547+ }
548+
549+ srv := New (config.ServerConfig {
550+ MaxPacketSize : 65535 ,
551+ Domain : []string {"a.com" },
552+ MinVPNLabelLength : 3 ,
553+ }, nil , codec )
554+
555+ initPayload := []byte {0 , 0x00 , 0x00 , 0x96 , 0x00 , 0xC8 , 0x10 , 0x20 , 0x30 , 0x40 }
556+ initResponse := srv .handlePacket (buildTunnelQueryWithSessionID (t , codec , "a.com" , 0 , Enums .PACKET_SESSION_INIT , initPayload ))
557+ packet , err := DnsParser .ExtractVPNResponse (initResponse , false )
558+ if err != nil {
559+ t .Fatalf ("ExtractVPNResponse returned error: %v" , err )
560+ }
561+ sessionID := packet .Payload [0 ]
562+ sessionCookie := packet .Payload [1 ]
563+
564+ _ = srv .handlePacket (buildTunnelStreamQuery (t , codec , "a.com" , sessionID , sessionCookie , Enums .PACKET_STREAM_SYN , 15 , 1 , nil ))
565+
566+ targetPayload := []byte {0x03 , 0x0B , 'e' , 'x' , 'a' , 'm' , 'p' , 'l' , 'e' , '.' , 'c' , 'o' , 'm' , 0x01 , 0xBB }
567+ query := buildTunnelStreamQuery (t , codec , "a.com" , sessionID , sessionCookie , Enums .PACKET_SOCKS5_SYN , 15 , 2 , targetPayload )
568+ response := srv .handlePacket (query )
569+ vpnResponse , err := DnsParser .ExtractVPNResponse (response , false )
570+ if err != nil {
571+ t .Fatalf ("ExtractVPNResponse returned error: %v" , err )
572+ }
573+ if vpnResponse .PacketType != Enums .PACKET_SOCKS5_SYN_ACK {
574+ t .Fatalf ("unexpected packet type: got=%d want=%d" , vpnResponse .PacketType , Enums .PACKET_SOCKS5_SYN_ACK )
575+ }
576+
577+ streamRecord , ok := srv .streams .Lookup (sessionID , 15 )
578+ if ! ok {
579+ t .Fatal ("expected stream state to exist" )
580+ }
581+ if streamRecord .TargetHost != "example.com" || streamRecord .TargetPort != 443 {
582+ t .Fatalf ("unexpected bound target: %+v" , streamRecord )
583+ }
584+ }
585+
586+ func TestHandlePacketRejectsInvalidSocks5Syn (t * testing.T ) {
587+ codec , err := security .NewCodec (0 , "" )
588+ if err != nil {
589+ t .Fatalf ("NewCodec returned error: %v" , err )
590+ }
591+
592+ srv := New (config.ServerConfig {
593+ MaxPacketSize : 65535 ,
594+ Domain : []string {"a.com" },
595+ MinVPNLabelLength : 3 ,
596+ }, nil , codec )
597+
598+ initPayload := []byte {0 , 0x00 , 0x00 , 0x96 , 0x00 , 0xC8 , 0x10 , 0x20 , 0x30 , 0x40 }
599+ initResponse := srv .handlePacket (buildTunnelQueryWithSessionID (t , codec , "a.com" , 0 , Enums .PACKET_SESSION_INIT , initPayload ))
600+ packet , err := DnsParser .ExtractVPNResponse (initResponse , false )
601+ if err != nil {
602+ t .Fatalf ("ExtractVPNResponse returned error: %v" , err )
603+ }
604+
605+ _ = srv .handlePacket (buildTunnelStreamQuery (t , codec , "a.com" , packet .Payload [0 ], packet .Payload [1 ], Enums .PACKET_STREAM_SYN , 16 , 1 , nil ))
606+ query := buildTunnelStreamQuery (t , codec , "a.com" , packet .Payload [0 ], packet .Payload [1 ], Enums .PACKET_SOCKS5_SYN , 16 , 2 , []byte {0x09 , 0x00 , 0x35 })
607+ response := srv .handlePacket (query )
608+ vpnResponse , err := DnsParser .ExtractVPNResponse (response , false )
609+ if err != nil {
610+ t .Fatalf ("ExtractVPNResponse returned error: %v" , err )
611+ }
612+ if vpnResponse .PacketType != Enums .PACKET_SOCKS5_ADDRESS_TYPE_UNSUPPORTED {
613+ t .Fatalf ("unexpected packet type: got=%d want=%d" , vpnResponse .PacketType , Enums .PACKET_SOCKS5_ADDRESS_TYPE_UNSUPPORTED )
614+ }
615+ }
616+
543617func TestSessionStoreExpiresReuseSignatureWithoutDroppingSession (t * testing.T ) {
544618 store := newSessionStore ()
545619 payload := []byte {1 , 0x21 , 0x00 , 0x96 , 0x00 , 0xC8 , 0x44 , 0x33 , 0x22 , 0x11 }
0 commit comments