@@ -658,4 +658,148 @@ protected override int GetRandLen(int datalength, xorshift128plus random, byte[]
658658 }
659659
660660 }
661+
662+ class AuthChain_c : AuthChain_b
663+ {
664+ public AuthChain_c ( string method )
665+ : base ( method )
666+ {
667+
668+ }
669+
670+ private static Dictionary < string , int [ ] > _obfs = new Dictionary < string , int [ ] > {
671+ { "auth_chain_c" , new int [ ] { 1 , 0 , 1 } } ,
672+ } ;
673+
674+ protected int [ ] data_size_list0 = null ;
675+
676+ public static new List < string > SupportedObfs ( )
677+ {
678+ return new List < string > ( _obfs . Keys ) ;
679+ }
680+
681+ public override Dictionary < string , int [ ] > GetObfs ( )
682+ {
683+ return _obfs ;
684+ }
685+
686+ protected new void InitDataSizeList ( )
687+ {
688+ xorshift128plus random = new xorshift128plus ( ) ;
689+ random . init_from_bin ( Server . key ) ;
690+ int len = ( int ) ( random . next ( ) % ( 8 + 16 ) + ( 4 + 8 ) ) ;
691+ List < int > data_list = new List < int > ( ) ;
692+ for ( int i = 0 ; i < len ; ++ i )
693+ {
694+ data_list . Add ( ( int ) ( random . next ( ) % 2340 % 2040 % 1440 ) ) ;
695+ }
696+ data_list . Sort ( ) ;
697+ data_size_list0 = data_list . ToArray ( ) ;
698+ }
699+
700+ public override void SetServerInfo ( ServerInfo serverInfo )
701+ {
702+ Server = serverInfo ;
703+ InitDataSizeList ( ) ;
704+ }
705+
706+ protected override int GetRandLen ( int datalength , xorshift128plus random , byte [ ] last_hash )
707+ {
708+ int other_data_size = datalength + Server . overhead ;
709+
710+ // 一定要在random使用前初始化,以保证服务器与客户端同步,保证包大小验证结果正确
711+ random . init_from_bin ( last_hash , datalength ) ;
712+ if ( other_data_size >= data_size_list0 [ data_size_list0 . Length - 1 ] )
713+ {
714+ if ( datalength >= 1440 )
715+ return 0 ;
716+ if ( datalength > 1300 )
717+ return ( int ) ( random . next ( ) % 31 ) ;
718+ if ( datalength > 900 )
719+ return ( int ) ( random . next ( ) % 127 ) ;
720+ if ( datalength > 400 )
721+ return ( int ) ( random . next ( ) % 521 ) ;
722+ return ( int ) ( random . next ( ) % 1021 ) ;
723+ }
724+
725+ int pos = FindPos ( data_size_list0 , other_data_size ) ;
726+ int final_pos = pos + ( int ) ( random . next ( ) % ( ulong ) ( data_size_list0 . Length - pos ) ) ;
727+ return data_size_list0 [ final_pos ] - other_data_size ;
728+ }
729+
730+ }
731+
732+ class AuthChain_d : AuthChain_c
733+ {
734+ public AuthChain_d ( string method )
735+ : base ( method )
736+ {
737+
738+ }
739+
740+ private static Dictionary < string , int [ ] > _obfs = new Dictionary < string , int [ ] > {
741+ { "auth_chain_d" , new int [ ] { 1 , 0 , 1 } } ,
742+ } ;
743+
744+ public static new List < string > SupportedObfs ( )
745+ {
746+ return new List < string > ( _obfs . Keys ) ;
747+ }
748+
749+ public override Dictionary < string , int [ ] > GetObfs ( )
750+ {
751+ return _obfs ;
752+ }
753+
754+ protected void CheckAndPatchDataSize ( List < int > data_list , xorshift128plus random )
755+ {
756+ if ( data_list [ data_list . Count - 1 ] < 1300 && data_list . Count < 64 )
757+ {
758+ data_list . Add ( ( int ) ( random . next ( ) % 2340 % 2040 % 1440 ) ) ;
759+ CheckAndPatchDataSize ( data_list , random ) ;
760+ }
761+ }
762+
763+ protected new void InitDataSizeList ( )
764+ {
765+ xorshift128plus random = new xorshift128plus ( ) ;
766+ random . init_from_bin ( Server . key ) ;
767+ int len = ( int ) ( random . next ( ) % ( 8 + 16 ) + ( 4 + 8 ) ) ;
768+ List < int > data_list = new List < int > ( ) ;
769+ for ( int i = 0 ; i < len ; ++ i )
770+ {
771+ data_list . Add ( ( int ) ( random . next ( ) % 2340 % 2040 % 1440 ) ) ;
772+ }
773+ data_list . Sort ( ) ;
774+ int old_len = data_list . Count ;
775+ CheckAndPatchDataSize ( data_list , random ) ;
776+ if ( old_len != data_list . Count )
777+ {
778+ data_list . Sort ( ) ;
779+ }
780+ data_size_list0 = data_list . ToArray ( ) ;
781+ }
782+
783+ public override void SetServerInfo ( ServerInfo serverInfo )
784+ {
785+ Server = serverInfo ;
786+ InitDataSizeList ( ) ;
787+ }
788+
789+ protected override int GetRandLen ( int datalength , xorshift128plus random , byte [ ] last_hash )
790+ {
791+ int other_data_size = datalength + Server . overhead ;
792+
793+ if ( other_data_size >= data_size_list0 [ data_size_list0 . Length - 1 ] )
794+ {
795+ return 0 ;
796+ }
797+
798+ random . init_from_bin ( last_hash , datalength ) ;
799+ int pos = FindPos ( data_size_list0 , other_data_size ) ;
800+ int final_pos = pos + ( int ) ( random . next ( ) % ( ulong ) ( data_size_list0 . Length - pos ) ) ;
801+ return data_size_list0 [ final_pos ] - other_data_size ;
802+ }
803+
804+ }
661805}
0 commit comments