@@ -658,4 +658,148 @@ protected override int GetRandLen(int datalength, xorshift128plus random, byte[]
658
658
}
659
659
660
660
}
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
+ }
661
805
}
0 commit comments