Net-Shadowsocks

 view release on metacpan or  search on metacpan

lib/Net/Shadowsocks/Server.pm  view on Meta::CPAN

                                                                    $decrypt_nonce = $decrypt_nonce->increment();
                                                                    $decryptor->reset();
                                                                    $decryptor->iv_add($decrypt_nonce);
                                                                    $decryptor->adata_add("");
                                                                    $decrypted_data = $decryptor->decrypt_add(substr($incoming_data,18,$header_len ));
                                                                    my $header_tag = substr($incoming_data,18 + $header_len,16);
                                                                    my $header_result = $decryptor->decrypt_done($header_tag);
                                                                     if ( !$header_result ) 
                                                                     {
                                                                         AE::log error =>  "data forged!";
                                                                         $chandle->destroy();
                                                                     }
                                                                     else
                                                                     {
                                                                         $decrypt_nonce = $decrypt_nonce->increment();  
                                                                         #$decryptor->reset();      
                                                                         $incoming_data = substr($incoming_data,$chunk_len);                                                                       
                                                                         $chandle->{rbuf} = $incoming_data;     
                                                                         #carp "more chunk to process" if (length($incoming_data ) > 0);                                                                
                                                                     }  
                                                                }      
                                                            }
                                                        }
                                                    }
                                    }

                                    else 
                                     {
                                          $decrypted_data = $decryptor->decrypt($incoming_data,$key,$client_iv);
                                     }
                                     if (defined($remotehandler))
                                     {
                                          $remotehandler->push_write($decrypted_data);
                                     }
                                     else
                                     { 
                                         AE::log error => "lost connection to remote";
                                         $mode = 0;
                                         $chandle ->destroy();
                                     }  
                                }
                            }
                       } 
                       if ($self->{method} !~ /gcm$/ and $self->{method} !~ /poly1305$/)
                       {
                            $chandle->{rbuf} = undef;
                       } 
                    }
                );
            },
            sub 
            {
                    my $client_socket = shift;
                    setsockopt($client_socket,,SOL_SOCKET, SO_REUSEADDR, 1);
                    if ( $_osname eq "linux" and  -e "/proc/sys/net/ipv4/tcp_fastopen") 
                    {
                        if (-r "/proc/sys/net/ipv4/tcp_fastopen")
                        {
                            my $_tfo = do 
                            {
                                local ( @ARGV, $/ ) = "/proc/sys/net/ipv4/tcp_fastopen";<>;
                            };
                            if ( $_tfo == 2 or $_tfo == 3 ) 
                            {
                                setsockopt( $client_socket, IPPROTO_TCP, TCP_FASTOPEN, 1 );
                                AE::log info => "TCP Fast Open enabled on server.";
                            }
                        }
                    }
                    elsif ( $_osname eq "darwin" ) 
                    {
                        my $_version_major = substr( $_osvers, 0, index( $_osvers, "." ) );
                        if ( $_version_major >= 15 ) 
                        {
                            setsockopt( $client_socket, IPPROTO_TCP, TCP_FASTOPEN, 1 );
                            AE::log info => "TCP Fast Open enabled on server.";
                        }
                    }
            },
        );
        my $cv = AE::cv;
        $cv->recv();
        return $self;
    }
1;    # End of Net::Shadowsocks::Server
  
  __END__ 
    
=pod

=encoding utf8
    
=head1 NAME

Net::Shadowsocks::Server - Shadowsocks protocol server module.

=head1 VERSION

Version 0.9.3.2

=head1 SYNOPSIS

    use Net::Shadowsocks::Server;
    
=head1 DESCRIPTION

1. A total of 34 encryption methods are supported:

	aes-128-cfb aes-128-ctr aes-128-gcm aes-128-ofb
	aes-192-cfb aes-192-ctr aes-192-gcm aes-192-ofb
	aes-256-cfb aes-256-ctr aes-256-gcm aes-256-ofb
	camellia-128-cfb camellia-128-ctr camellia-128-ofb
	camellia-192-cfb camellia-192-ctr camellia-192-ofb
	camellia-256-cfb camellia-256-ctr camellia-256-ofb
	chacha20-ietf chacha20-ietf-poly1305
	rc4-md5
	rc6-128-cfb rc6-128-ctr rc6-128-ofb
	rc6-192-cfb rc6-192-ctr rc6-192-ofb
	rc6-256-cfb rc6-256-ctr rc6-256-ofb
	spritz



( run in 0.792 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )